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.定制排序