美文网首页
2019-03-23 集合-set

2019-03-23 集合-set

作者: 不被动 | 来源:发表于2019-03-23 16:46 被阅读0次


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 表示相等;

相关文章

网友评论

      本文标题:2019-03-23 集合-set

      本文链接:https://www.haomeiwen.com/subject/nrvsvqtx.html