zoukankan      html  css  js  c++  java
  • 根据不同的排序规则对列表进行不同的排序

    根据不同的排序规则对列表进行不同的排序

    使用List的sort方法进行排序

    可以先进入List的sort方法中看一下相关的代码

    @SuppressWarnings({"unchecked", "rawtypes"})
    default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }
    

    可以看到sort方法需要一个Comparator类型的对象至于Comparator,在Java中是一个外部比较器。

    使用 Comparator.comparing 进行排序

    可以先看下Comparator中comparing 的内部实现

    public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
            Function<? super T, ? extends U> keyExtractor)
    {
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)
            (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    }
    

    当我们需要对集合的元素进行排序的时候,可以使用java.util.Comparator 创建一个比较器来进行排序。Comparator接口同样也是一个函数式接口,我们可以把使用lambda表达式。如下示例,

     /** * Comparator.comparing 方法的使用 * * comparing 方法接收一个 Function 函数式接口 ,通过一个 lambda 表达式传入 * */ 
     resultList.sort(Comparator.comparing(e -> e.getWorkTime()));
      /**
      * 这个方法引用 ReportFormVo::getWorkTime 可以代替 lambda表达式
      */
     resultList.sort(Comparator.comparing(ReportFormVo::getWorkTime));
    

    使用 Comparator.reversed 进行倒排序

    返回相反的排序规则,

    /**
     *  相反的排序规则
     */
    Collections.sort(resultList, Comparator.comparing(ReportFormVo::getWorkTime).reversed());
    
    resultList.forEach(System.out::println);
    

    输出,

    Employee{name='Keith', age=35, salary=4000.0, mobile=3924401}
    Employee{name='John', age=25, salary=3000.0, mobile=9922001}
    Employee{name='Ace', age=22, salary=2000.0, mobile=5924001}
    

    有个需求是将List里面的数据按照不同的排序规则去进行排序,然后进行倒序,Comparator.reversed()方法是倒序的意思,具体实现代码部分如下:

    //排序
    switch (sortRule) {
        case 1: {
            resultList.sort(Comparator.comparing(ReportFormVo::getWorkTime).reversed());
            break;
        }
        case 2: {
            resultList.sort(Comparator.comparing(ReportFormVo::getArea).reversed());
            break;
        }
        case 3: {
            resultList.sort(Comparator.comparing(ReportFormVo::getRunningTime).reversed());
            break;
        }
        default: {
            resultList.sort(Comparator.comparing(ReportFormVo::getOffLineTime).reversed());
        }
    }
    

    使用 Comparator.nullsFirst进行排序

    当集合中存在null元素时,可以使用针对null友好的比较器,null元素排在集合的最前面

    resultList.add(null);  //插入一个null元素
    Collections.sort(resultList, Comparator.nullsFirst(Comparator.comparing(ReportFormVo::getWorkTime)));
    employees.forEach(System.out::println);
    
    //也可以写成
    Collections.sort(resultList, Comparator.nullsLast(Comparator.comparing(ReportFormVo::getWorkTime)));
    resultList.forEach(System.out::println);
    

    使用 Comparator.thenComparing 排序

    首先使用 WorkTime排序,紧接着在使用Area排序,循环进行嵌套

    Collections.sort(resultList, Comparator.comparing(ReportFormVo::getWorkTime).thenComparing(ReportFormVo::getArea));
    resultList.forEach(System.out::println);
    实战为王,记录在工作中技术使用的点点滴滴
  • 相关阅读:
    Linux mysql 联表查询
    Linux firewalld使用教程+rhce课程实验
    Linux 常用端口
    Linux redhat 7 进入单用户模式
    Linux 子网掩码计算, 二进制十进制互相转换
    Linux 网络配置文件解析
    P1678 烦恼的高考志愿(二分)
    P1563 玩具谜题(简单模拟)
    P1553 数字反转(升级版)(模拟)
    P2690 接苹果 (DP)
  • 原文地址:https://www.cnblogs.com/kaikai-wanna-know/p/12595259.html
Copyright © 2011-2022 走看看