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方法,根据返回值进行排序。
在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序
二叉树
每一个节点可以存四个值 父节点地址值 自己存的值,左子节点地址值 右子节点地址值
度:每一个节点的子节点数量
二叉树中,任意一个节点的度要小于等于2
二叉查找树,又称二叉排序树或者二叉搜索数
特点:
1.每一个几点上班最多有两个子节点
2.左子树上的所有节点的值都小于根节点的值
3.右子树上所有节点的值都大于根节点的值
二叉查找树添加节点规则:
小的存左边,大的存右边,一样的不存
平衡二叉树
1.二叉树左右两个子树的高度差不超过1
2.任意节点的左右两个子树都是一个平衡二叉树
左边的 10 左子树高度0 又子树高度3 不符合
右边的 4 左子树高度2 右子树高度0 不符合
平衡二叉树 旋转
左旋,右旋
触发时机:当添加一个节点后,该数不再是一颗平衡二叉树
旋转完成,重新达到平衡
十号位旋转后将原先的左节点让出,给原来的7号当右节点
右旋同理
平衡二叉树 旋转的几种情况
左左:根节点左子树的左子树有节点插入,导致二叉树不平衡
左右:根节点左子树的右子树有节点插入,导致二叉树不平衡
左左的情况比较简单,就不再赘述,我们来看左右的:
左右的情况
一次旋转肯定没办法达到平衡
先将选中的地方,进行一个左旋得到如下图
这样的话 我们整体做一个右旋就可以了
右右跟右左同理
红黑树
红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构
1972年出现,当时被称之为平衡二叉B树。后来1978年被修改为如今的红黑树
他是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色。
每一个节点可以是红或者黑。红黑树不是高度平衡的,他的平衡式通过红黑规则进行实现的
红黑规则
1.每个几点不是红色就是黑色
2.根节点必须是黑色
3.如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点是黑色的
4.如果某一个节点是红色,那么他的子节点必须是黑色
5.对每一个节点,从该节点到期所有后代叶节点的简单路劲上,都包含相同数目的黑色节点
红黑树添加节点
添加节点时默认颜色为红色效率更高