根据不同的排序规则对列表进行不同的排序
使用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);