1.API
基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
查看如下代码
平时往TreeSet中添加基本类型调用的是TreeSet的无参构造方法,因此是自然排序。
获得结果
自然排序实现了排序和去重,关键是add方法
2.API
NavigableMap<K,V>是一个接口,而这个接口的实现类是TreeMap,所以回过头来我们查看TreeMap的put方法。
TreeMap类是基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
往TreeSet中传入自定义对象
首先,需要自定义对象保证排序和唯一;
举例解析
因为自定义对象没有比较规则,所以TreeSet不知道怎么比较,所以报错,因此我们可以定义一个比较器,也就是所谓的带参数的TreeSet构造方法
API
自定义比较器
TreeSet<Dog> ts = new TreeSet<Dog>(new Comparator<Dog>){
@Override
public int compare(Dog o1,Dog o2){
int num1 = o1.getName().compareTo(o2.getName());
int num2 = num1 == 0 ? o1.getAge() - o2.getAge() : num1;
return num2;
}
});
用匿名内部类传入一个comparator接口(自定义比较器),重写了抽象方法compare,方法传入两个相互比较的参数,根据return来判断是否往TreeSet中传入以及以怎样的顺序来往红黑树里面存入元素。(例:return返回0,则表示两个元素相同了,不添加)
获得比较结果
TreeSet排序原理总结
TreeSet集合保证元素排序和唯一性的原理
唯一性:是根据比较的返回是否是0来决定的
排序:
A:自然排序(元素具有比较性)
让元素所属的类实现自然排序的接口Comparable
B:比较器排序(集合具有比较性)
让集合的构造方法接受一个比较器接口的子类对象Comparator