2019-03-23 集合-set


1.不重复元素的容器

1.1如何自定义不能存放重复元素的容器

1、]现在需要我们自己设计一个容器类,不能够添加重复元素(如果元素重复了就添加不进去)

2、在前面我们设计的基于数组的自定义容器类的基础上改版

3、需要在add方法内部判断重复

4、如何判断:

每一次调用add会传入一个参数: 用户希望添加的元素  ele

遍历内部的数组,判断数组中是否包含ele

1.2代码实现


2.HashSet

2.1语法特点:不重复,无序(不保证和添加顺序一致)

1、不能够添加重复元素

2、初体验

可以添加案例:测试不重复和有序。


2.2是否重复判断规则

2.2.1 引入

通过一步步测试发现:我们不同HashSet内部到底是如何判断重复的?


2.2.2判断重复的方式

① 通过添加进去的元素的hashCode+eqauls两者进行比较

② 如果两个对象的hashCode相等  并且 两个对象调用equals结果是true  才认为两个元素重复

③ 示意图


2.2.3验证上面的规则

1打印上面示例中的元素的hashCode和equals的结果

2尝试自定义类,覆写hashCode 和 equals 这两个方法中的代码随便写



3.TreeSet

3.1语法特点

无序:不保证(不记录)我们的添加顺序;但是可以保证添加里面元素是有序的。

public static void main(String[] args) {

 Set<String> set = new HashSet<String>();

        set.add("catepillar");

        set.add("momor");

        set.add("bush");

        set.add("cateprillar");

         System.out.println(set);

}

不重复:不能够添加重复元素(多个心眼)如何判断重复的呢?


3.2简单体验

体验1


结果:虽然打印结果的顺序和添加顺序可能不一致,但是感觉结果是有某种规则排序的

说明String类也实现了Comparable接口,String对象可以调用compareTo方法


体验2


结果:居然不能够放不同的类型,但是编译没有错


体验3:添加自定义的类的对象Student对象


结果: 

疑问1:上面的代码添加的都是同种类型的数据,为什么还报错;

疑问2:为什么提示要把Student转成Comparable

正常情况----》 TreeSet  或者  Comparable的文档


3.3 TreeSet的结构(存储原理)分析






3.4自然排序与定制排序(比较器)

3.4.1自然排序  Comparable

从TreeSet的API文档中点击 “自然排序”  ---》 Comparable接口中

文档中的描述: 

此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法


理解:

如果一个类实现了Comparable接口,可以认为这个类的对象具有自然排序的能力(本质就是这个对象可以调用比较的方法compareTo),这种比较和排序的规则就是自然排序






3.4.2定制排序(比较器)Comparator

1、根据上面的分析,如果我们的对象没有实现Comparable接口,感觉就无法添加到TreeSet中去;(这些对象就没有自然排序的能力);

2、上面的示例设计有点问题:Student类中覆写的compareTo方法按照年龄从小到大排列的,万一有的人也是用我们的Student,希望年龄从大到小进行排列,怎么办?

不管Student里面使用何种规则都不能满足所有的人

3、解决办法:可以给TreeSet单独的提供一个比较器(理解为比较的一个工具)

4、Comparator是一个比较器的接口(标准),必须得有进行比较的方法 :compare(Object o1,Object o2);

自定义一个类实现Comparator接口,其中写比较规则  ---》 比较器的模板

我们现在需要的是一个具体的比较器对象


示例:








3.5 判断重复的标准

1、如果采用的是自然排序调用对象的compareTo方法,如果返回0 表示相等;

2、如果使用的定制排序(比较器),调用比较器的方法compare返回0 表示相等;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容