java Comparator多属性排序
排序
排序分为自然排序(Comparable)或Comparator(定制排序)。常用的排序有内存中Comparator
接口的方法。
自然排序
自然排序通常情况跟equals保持一致,e1,e2是类C的元素,如果e1.compareTo(e2) == 0 那么e1和e2 equals的结果也是true
实现Comparable接口的对象列表(和数组)可以通过Collections.sort 或 Arrays.sort
进行自动排序
定制排序
- 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码, 或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那 么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排 序的比较
- 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返 回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示 o1小于o2
java Comparator多条件排序
有的时候获取的数据需要在内存排序,需要根据List
在此之前先看下: Compartor源码解读 , 看完之后再看 java8 stream多字段排序。
用到的类如下
@Getter
@Setter
@Builder
@ToString
static class RwVO {
@ApiModelProperty("届次")
private Integer jc;
@ApiModelProperty("开始日期")
private LocalDate ksrq;
@ApiModelProperty("创建时间")
private LocalDateTime cjsj;
}
多字段排序已经算是写的比较清楚的了,不过还是要做一些补充:
Comparator.comparing(类::属性一)
按属性一升序,Comparator.comparing(类::属性一, Comparator.reverseOrder())
按属性一降序
多个属性,按不同的升降序规则,就变的非常简单了,只需要在下面的 Comparator.reverseOrder()
处根据升降序规则觉得保留还是删掉即可。这种规则掌握了,管它几个属性排序,管它什么升序降序,通通解决。
Comparator.comparing(类::属性一, Comparator.reverseOrder())
.thenComparing(类::属性一, Comparator.reverseOrder())
Comparator.comparing(类::属性一).reversed();
与Comparator.comparing(类::属性一,Comparator.reverseOrder());
不完全等价。
因为有的时候它俩结果一致,比如刚好就只有一个属性排序的时候,但多数情况下,二者是不一致的。比如有多个排序属性的时候。someComparator.reversed()
是将someComparator
的结果给反转,而这个someComparator
可以是多个compartor组合而成。例如下面这个比较器,做的就是先根据届次正序排、相等的再根据开始日期正序排,然后把得到的结果反转,换句话讲,按届次倒序、开始日期倒序排:
Comparator.comparing(RwVO::getJc)
.thenComparing(RwVO::getKsrq).reversed();
当然也可以这么写
Comparator.comparing(RwVO::getJc, Comparator.reverseOrder())
.thenComparing(RwVO::getKsrq, Comparator.reverseOrder());
当你准备好了,机会来临的时候,你才能抓住