TreeSet排序原理

来源:互联网 发布:西电人工智能学院 编辑:程序博客网 时间:2024/05/19 22:52

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