Set集合

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方法返回值为负数数,返回值写死,那么就是先进后出。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值