java set用法排序 java对set集合排序_开发语言

Set集合概述和特点

特点:

1.可以去重复 (如果有相同的数据则会只存入一个)

2.存取顺序不一致

3.没有带索引的方法,索引不能使用普通for循环遍历,也不能通过索引来获取,删除set集合里面的元素

 所以索引set集合只能使用迭代器跟增强for进行遍历集合

Iterator<String> it = set.iterator()
while(it.hasnext()){
String s = it.next();
sout(s)
}

TreeSet :

特点:

1.不包含重复元素的集合

2.没有带索引的方法

3.可以将元素按照规则进行排序

也就 如果想要使用TreeSet就要指定排序的规则 ,不然没法使用

自然排序Comparable的使用

1.使用空参构造创建TreeSet集合

2.自定义的Student类实现Comparable接口

3.重写里面的comparaTo方法

自然排序简单原理图:

如果返回值为负数,表示当前存入的元素是较小值,存左边

如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存

如果返回值为整数,表示当前存入的元素是较大值,存右边


@Override public int compareTo(Student o) { int result=this.age-o.age; return result; }


this.age代表正在存入的数据的年龄,o.age代表已经存入的数据的年龄,

如果移动后位置还有数据存在 则会继续比较

因为年龄可能相同,如果相同 数据就不会存入了 ,那么我们要新增一个次级比较


@Override public int compareTo(Student o) { int result=this.age-o.age; result= result==0?this.name.compareTo(o.name):result; return result; }


方法内的compareTo是字符串的比较方法,返回值也是int类型的

Comparator比较器排序

TreeSet的带参构造方法使用的是比较器排序对元素进行排序的

比较器排序,就是让集合构造方法时就接收Comparator的实现类对象,重写compare(T o1,T o2)方法

重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写


Set<Student> setList = new TreeSet<>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { int result=o1.getAge()-o2.getAge(); result=result==0?o1.getName().compareTo(o2.getName()):result; return result; } });


两种比较方式小结:

自然排序:自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序。

比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。

在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序

二叉树

java set用法排序 java对set集合排序_java set用法排序_02

每一个节点可以存四个值   父节点地址值 自己存的值,左子节点地址值 右子节点地址值

度:每一个节点的子节点数量          

 二叉树中,任意一个节点的度要小于等于2

java set用法排序 java对set集合排序_java set用法排序_03

java set用法排序 java对set集合排序_java set用法排序_04

 二叉查找树,又称二叉排序树或者二叉搜索数

特点:

1.每一个几点上班最多有两个子节点

2.左子树上的所有节点的值都小于根节点的值

3.右子树上所有节点的值都大于根节点的值

二叉查找树添加节点规则:

小的存左边,大的存右边,一样的不存

平衡二叉树

1.二叉树左右两个子树的高度差不超过1

2.任意节点的左右两个子树都是一个平衡二叉树

java set用法排序 java对set集合排序_开发语言_05

 左边的 10  左子树高度0  又子树高度3   不符合 

右边的  4   左子树高度2  右子树高度0  不符合

平衡二叉树 旋转 

左旋,右旋 

触发时机:当添加一个节点后,该数不再是一颗平衡二叉树

java set用法排序 java对set集合排序_java_06

java set用法排序 java对set集合排序_子树_07

旋转完成,重新达到平衡

 

java set用法排序 java对set集合排序_子树_08

java set用法排序 java对set集合排序_开发语言_09


十号位旋转后将原先的左节点让出,给原来的7号当右节点 

 右旋同理

平衡二叉树  旋转的几种情况

左左:根节点左子树的左子树有节点插入,导致二叉树不平衡

左右:根节点左子树的右子树有节点插入,导致二叉树不平衡 

左左的情况比较简单,就不再赘述,我们来看左右的:

java set用法排序 java对set集合排序_红黑树_10

左右的情况

一次旋转肯定没办法达到平衡

先将选中的地方,进行一个左旋得到如下图

java set用法排序 java对set集合排序_子树_11

这样的话 我们整体做一个右旋就可以了

java set用法排序 java对set集合排序_子树_12

 右右跟右左同理 

红黑树

红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构

1972年出现,当时被称之为平衡二叉B树。后来1978年被修改为如今的红黑树

他是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色。

每一个节点可以是红或者黑。红黑树不是高度平衡的,他的平衡式通过红黑规则进行实现的

红黑规则

1.每个几点不是红色就是黑色

2.根节点必须是黑色

3.如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点是黑色的

4.如果某一个节点是红色,那么他的子节点必须是黑色

5.对每一个节点,从该节点到期所有后代叶节点的简单路劲上,都包含相同数目的黑色节点

红黑树添加节点

添加节点时默认颜色为红色效率更高

java set用法排序 java对set集合排序_java set用法排序_13

父节点为红,叔叔节点也是红

java set用法排序 java对set集合排序_java_14

java set用法排序 java对set集合排序_java set用法排序_15

父节点为红,叔叔节点是黑色

java set用法排序 java对set集合排序_子树_16

java set用法排序 java对set集合排序_开发语言_17

java set用法排序 java对set集合排序_子树_18