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


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

    使用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);
    实战为王,记录在工作中技术使用的点点滴滴
  • 相关阅读:
    SetConsoleScreenBufferSize 函数--设置控制台屏幕缓冲区大小
    GetConsoleScreenBufferInfo 函数--获取控制台屏幕缓冲区信息
    CONSOLE_SCREEN_BUFFER_INFO 结构体
    GetStdHandle 函数--获取标准设备的句柄
    设计模式之代理模式(Proxy Pattern)_远程代理解析
    设计模式之状态模式(State Pattern)
    设计模式之组合模式(Composite Pattern)
    设计模式之迭代器模式(Iterator Pattern)
    设计模式之模版方法模式(Template Method Pattern)
    设计模式之外观模式(Facade Pattern)
  • 原文地址:https://www.cnblogs.com/kaikai-wanna-know/p/12595259.html
Copyright © 2020-2023  润新知