您的位置:首页 > 其它

Set集合

2019-05-21 22:26 120 查看

Set集合

集合框架set

Set集合是没有重复值的,并且无序,但在jdk1.7 ,1.8后能小数据的排序 比如 1,2,4,5,3,6 遍历输出是经过排序的 或者 字符串小幅度的排序

List只依赖于equals方法

Set依赖于hashCode、equals方法

HashSet哈希表存储,重复元素存储底层探究

我们先创一个实体类,例如人类,我们假设只要这两个人的名字和年龄是一样的就认为是同一个人,那么我们要用哈希表来去重复比较,便打印输出 比较,在toString中return输出属性 避免打印输出地址 我在这里就写两个属性 方便查看

public String toString() {
return “Person [name=”+name+", age="+age+"]";
}

我们在类中写一个返回类型是 boolean 的方法,来方便查看 比较

public boolean equals(Object obj) {
if (obj instanceof Person) {
Person p = (Person) obj;
//this.name 暂时还没有存进新的集合
//p.getName() 已经在集合里的
System.out.println(this.getName()+"  equals  "+p.getName() );
return this.getName().equals(p.getName())&&this.getAge()==p.getAge();
}
return false;
}

然后在实体类中调用哈希表特有的方法 hashCode()

遍历输出便可以看到 重复的属性并没有添加进去

集合框架TreeSet(自然排序、数据结构二叉树、比较器排序)

自然排序

TreeSet可以对set集合中元素进行排序String实现了Comparable接口,所以可以直接进行排序,引用数据类型想要排序,必须实现 Comparable接口
没有的话就会报数据类型异常

我们假设要打印出一个年龄相同的人但他们的名字不一样 或者 年龄不相同名字相同,但在TreeSet中会自动过滤所以我们要运用 Comparable来完成
hashSet中
我们在hashSet中里写人的实体类实现Comparable接口 并在TreeSet中运行

class Person implements Comparable<Person>

重写Comparable 方法就可以解决了

public int compareTo(Person o) {
int num = this.getAge() - o.getAge();
if (num ==0) {
return this.getName().compareTo(o.getName());
}
return this.getAge() - o.getAge();//进行从小到大的排序
}

这样不会把名字或者年龄的数据去掉了

TreeSet比较器排序

TreeSet排序的第二种方式
当元素自身不具备比较性时,或者具备的比较性不是所需要的;
注意:这时需要让集合自身具备比较性
在集合初始化时,就有了比较方式;
定义一个类,实现comparator接口,实现compare方法
当两种排序都存在时,比较器排序优先级更高
因此比较器用的多一些,在实际开发中,很多时候,引用数据类型是否具有比较性,或者比较规则,可能不由开发人员自己决定,
那么开发人员想要对应的引用数据类型按照自己的排序方式进行排列,那么就需要实现comparator接口,实现compare方法

用两个案例说明

1、打破原有的person排序规则进行排序

2、按照字符串长度进行排序(String默认是按照hashCode值进行排序的)

我们需要 前面的排序规则 想根据年龄,再按姓氏排序
系统中有另一个模块,需要对用户表中排序规则进行更改 根据姓氏,再按年龄排序
我们继续用同样的方法在TreeSet里写一个实现compare方法
先根据年龄,再按姓氏排序运行效果就是这样

如果想要先按姓名再按年龄那么我们就这样 加一个参数 无论需求怎么都可以实现

TreeSet ts = new TreeSet(new personComp());

叉树排序

可以对set集合进行排序,底层数据结构是二叉树;
保证元素唯一性的依据是,compareTo方法return 0 所以注意:TreeSet排序的第一种方式,让元素自身具有比较性;
元素需要实现Comparable接口,覆盖compareTo方法;
这种方式也被称为元素的自然顺序,或者叫做默认顺序。
就这样类似于小学生的一种排序图 只不过是拿已经定好的数据池里进行排序
哪边的数据排序比较多就会作为"树的主干"

那么如何让TreeSet集合中的元素怎么存进去怎么取出来呢?
compareTo方法返回值为正数,返回值写死,那么就是怎么存进去怎么取出来。
compareTo方法返回值为负数数,返回值写死,那么就是先进后出。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: