8.3.3 TreeSet类 2.定制排序
8.3.3 TreeSet类 2.定制排序
自然排序默认是升序排列的
TreeSet
的自然排序是根据集合元素的大小, TreeSet
将它们以升序排列。
定制排序
如果需要实现定制排序,例如以降序排列,则可以通过Comparator
接口的帮助。该接口里包含一个int compare(T o1,T o2)
方法:
Comparator 接口的compare 方法 |
描述 |
---|---|
int compare(T o1, T o2) |
Compares its two arguments for order. |
该方法用于比较o1
和o2
的大小:
- 如果该方法返回正整数,则表明
o1
大于o2
; - 如果该方法返回0,则表明
o1
等于o2
; - 如果该方法返回负整数,则表明
o1
小于o2
;
如何实现定制排序
如果需要实现定制排序,则需要在创建TreeSet
集合对象时,提供一个Comparator
对象与该TreeSet
集合关联,由该Comparator
对象负责集合元素的排序逻辑。
由于Comparator
是一个函数式接口,因此可使用Lambda
表达式来代替Comparator
对象。
程序 TreeSet定制排序 使用Lambda表达式
1 | import java.util.*; |
上面程序中使用了目标类型为Comparator
的Lambda
表达式,它负责ts
集合的排序。所以当把M
对象添加到ts
集合中时,M
类无须实现Comparable
接口,因为此时TreeSet
无须通过M
对象本身来比较大小,而是由与TreeSet
关联的Lambda
表达式来负责集合元素的排序。
运行程序,看到如下运行结果:
1 | [M[age:9], M[age:5], M[age:-3]] |
放入TreeSet中对象的类型要相同
当通过Comparator
对象(或Lambda
表达式)来实现TreeSet
的定制排序时,依然不可以向TreeSet
中添加类型不同的对象,否则会引发ClassCastException
异常。
相等的元素不会再次添加到TreeSet中
使用定制排序时, TreeSet
对集合元素排序不管集合元素本身的大小,而是由Comparator
对象(或Lambda
表达式)负责集合元素的排序规则。 此时,TreeSet
判断两个集合元素相等的标准是:通过Comparator
(或Lambda
表达式)比较两个元素返回了0,这样TreeSet
不会把第二个元素添加到集合中。