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

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

使用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);