8.3.3 TreeSet类 2.定制排序
TreeSet
的自然排序是根据集合元素的大小, TreeSet
将它们以升序排列。如果需要实现定制排序,例如以降序排列,则可以通过Comparator
接口的帮助。该接口里包含一个int compare(T ol,T o2)
方法,该方法用于比较o1
和o2
的大小:
- 如果该方法返回正整数,则表明
o1
大于o2
; - 如果该方法返回0,则表明
o1
等于o2
; - 如果该方法返回负整数,则表明
o1
小于o2
;
如果需要实现定制排序,则需要在创建TreeSet
集合对象时,提供一个Comparator
对象与该TreeSet
集合关联,由该Comparator
对象负责集合元素的排序逻辑。由于Comparator
是一个函数式接口,因此可使用Lambda
表达式来代替Comparator
对象。
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]] |
注意
当通过Comparator
对象(或Lambda
表达式)来实现TreeSet
的定制排序时,依然不可以向TreeSet
中添加类型不同的对象,否则会引发ClassCastException
异常。
使用定制排序时, TreeSet
对集合元素排序不管集合元素本身的大小,而是由Comparator
对象(或Lambda
表达式)负责集合元素的排序规则。 TreeSet
判断两个集合元素相等的标准是:通过Comparator
(或Lambda
表达式)比较两个元素返回了0,这样TreeSet
不会把第二个元素添加到集合中。
原文链接: 8.3.3 TreeSet类 2.定制排序