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中T对象的属性p1,p2,p3等进行排序,该怎么写呢?
在此之前先看下: Compartor源码解读 , 看完之后再看 java8 stream多字段排序
用到的类如下

    @Getter
    @Setter
    @Builder
    @ToString
    static class RwVO {

        @ApiModelProperty("届次")
        private Integer jc;

        @ApiModelProperty("开始日期")
        private LocalDate ksrq;

        @ApiModelProperty("创建时间")
        private LocalDateTime cjsj;

    }

多字段排序已经算是写的比较清楚的了,不过还是要做一些补充:

  1. Comparator.comparing(类::属性一)按属性一升序,Comparator.comparing(类::属性一, Comparator.reverseOrder())按属性一降序

多个属性,按不同的升降序规则,就变的非常简单了,只需要在下面的 Comparator.reverseOrder()处根据升降序规则觉得保留还是删掉即可。这种规则掌握了,管它几个属性排序,管它什么升序降序,通通解决。

Comparator.comparing(类::属性一, Comparator.reverseOrder())
    .thenComparing(类::属性一, Comparator.reverseOrder())
  1. 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());
posted @ 2022-09-15 21:58  Code&Fight  阅读(3089)  评论(0编辑  收藏  举报