TreeSet
TreeSet是Set的一个子类,TreeSet集合是用来对象元素进行排序的,保证元素的唯一。
那TreeSet为什么能保证元素唯一?
如何指定比较的规则,需要在自定义类中实现Comparable
接口,并重写接口中的compareTo()
方法
public class Person implements Comparable {
private String name;
private int age;
public int compareTo(Object o) {
return 0; //当compareTo方法返回 0 的时候集合中 只有一个元素
return 1; //当compareTo方法返回 正数 的时候集合会 怎么存就怎么取
return -1; //当compareTo方法返回 负数 的时候集合会 倒序存储
}
}
存取有序,存储的元素不能重复,让元素所在的类实现Comparable接口,并重写CompareTo() 方法,并根据CompareTo()的返回值来进行添加元素
- 返回正数:往二叉树的右边添加
如果compareTo()
返回值为正数,元素值每次比较,都认为新插入的元素比上一个元素大,于是二叉树存储时,会存在根的右侧,读取时就是升序排列的。 - 返回负数:往二叉树的左边添加
如果compareTo()
返回为负数,元素值每次比较,都认为新插入的元素比上一个元素小,于是二叉树存储时,会存在根的左侧,读取时就是降序排列的。 - 返回 0 : 说明重复,不添加
如果compareTo()
返回值为0,元素值每次比较,都认为是相同的元素,这时就不再向TreeSet中插入除第一个外的新元素。所以TreeSet中就只存在插入的第一个元素。
总结
- 自然顺序(Comparable)
TreeSet类的add()方法中会把存入的对象提升为Comparable类型
调用对象的compareTo()方法和集合中的对象比较
根据compareTo()方法返回的结果进行存储 - 比较器顺序(Comparator)
创建TreeSet的时候可以制定 一个Comparator
如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
add()方法内部会自动调用Comparator接口中compare()方法排序
调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数 - 两种方式的区别
TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
TreeSet如果传入Comparator, 就优先按照Comparator
参考:https://blog.csdn.net/weixin_42697074/article/details/88917796