场景

Bean定义如下,仅有一个类型为Integer的age字段。

@NoArgsConstructor

@AllArgsConstructor(staticName = "of")

@Data

public static class Employee {

private Integer age;

}

列表初始化5个元素:

List list = new ArrayList<>();

list.add(Employee.of(21));

list.add(Employee.of(22));

list.add(Employee.of(25));

list.add(Employee.of(28));

list.add(Employee.of(23));

排序

使用Collections中的sort方法进行排序:

Collections.sort(list, new Comparator() {

@Override

public int compare(Employee o1, Employee o2) {

return o1.getAge().compareTo(o2.getAge());

}

});

倒序:

Collections.reverse(list);

lambda表达式

JDK8支持lambda表达式,写法更加简洁:

Collections.sort(list, (o1, o2) -> o1.getAge().compareTo(o2.getAge()));

或者使用Comparator接口:

Collections.sort(list, Comparator.comparing(Employee::getAge));

倒序:

Collections.sort(list, Comparator.comparing(Employee::getAge).reversed());

stream的sorted方法

list.stream().sorted(Comparator.comparing(Employee::getAge));

倒序:

list.stream().sorted(Comparator.comparing(Employee::getAge).reversed());

list自带的sort方法

list.sort(Comparator.comparing(Employee::getAge));

倒序:

list.sort(Comparator.comparing(Employee::getAge).reversed());

null值

假设列表中有age字段为null:

List list = new ArrayList<>();

list.add(Employee.of(21));

list.add(Employee.of(null));

list.add(Employee.of(null));

list.add(Employee.of(28));

list.add(Employee.of(23));

这个时候会报NPE:

-----------------------------

Exception in thread "main" java.lang.NullPointerException

at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)

at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)

at java.util.TimSort.sort(TimSort.java:220)

at java.util.Arrays.sort(Arrays.java:1512)

at java.util.ArrayList.sort(ArrayList.java:1462)

可以使用Comparator.comparing的第2个参数:

list.sort(Comparator.comparing(Employee::getAge, Comparator.nullsLast(Comparator.naturalOrder())));

list.sort(Comparator.comparing(Employee::getAge, Comparator.nullsLast(Integer::compareTo)));

list.sort(Comparator.comparing(Employee::getAge, Comparator.nullsLast(Comparable::compareTo)));

以上3中写法都可以,注意第2个参数使用了Comparator.nullsLast让null排在最后。

与之对应的是Comparator.nullsFirst可以null排在最前。

任意字段排序

最近项目中有个这样场景,List中是个Map,需要支持Map的任意key排序。

完整代码如下:

import java.util.*;

/**

* @author cdfive

* @date 2019-05-26

*/

public class ListSortDemo2 {

public static void main(String[] args) {

List> list = new ArrayList<>();

list.add(new HashMap(){{put("name", "aaa");put("age", 21);}});

list.add(new HashMap(){{put("name", "ccc");put("age", null);}});

list.add(new HashMap(){{put("name", "ddd");put("age", null);}});

list.add(new HashMap(){{put("name", "bbb");put("age", 28);}});

list.add(new HashMap(){{put("name", "aaa");put("age", 23);}});

printList(list);

printLineSep();

sort(list, "age", "asc");

printList(list);

}

public static void sort(List> list, String sortField, String sortDirection) {

if ("desc".equals(sortDirection)) {

Comparator> comparator = Comparator.comparing(o -> (Comparable) o.get(sortField), Comparator.nullsFirst(Comparable::compareTo));

list.sort(comparator.reversed());

} else {

Comparator> comparator = Comparator.comparing(o -> (Comparable) o.get(sortField), Comparator.nullsLast(Comparable::compareTo));

list.sort(comparator);

}

}

public static void printList(List> list) {

list.stream().forEach(o -> System.out.print(o));

System.out.println();

}

public static void printLineSep() {

System.out.println("-----------------------------");

}

}

注意:

倒序使用Comparator.nullsFirst和comparator.reversed(),需要单独定义comparator变量,如果直接一行写:

list.sort(Comparator.comparing(o -> (Comparable) o.get(sortField), Comparator.nullsFirst(Comparable::compareTo)).reversed());会编译不通过。

正序使用Comparator.nullsLast。

正序null在后面,倒序null在前面,可以这样写:

public static void sort2(List> list, String sortField, String sortDirection) {

Comparator> comparator = Comparator.comparing(new Function, Comparable>() {

@Override

public Comparable apply(Map map) {

Object obj = map.get(sortField);

if (obj instanceof Comparable) {

return (Comparable) obj;

}

if (obj == null) {

return null;

}

throw new UnsupportedOperationException("无法排序的字段=" + sortField);

}

}, Comparator.nullsLast(Comparator.naturalOrder()));

if ("desc".equals(sortDirection)) {

list.sort(comparator.reversed());

} else {

list.sort(comparator);

}

}

java list 排序_Java中List的排序相关推荐

  1. java 排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

  2. java中queue排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

  3. java map 自动排序_Java中Map的排序

    Map的种类 在Java中,Map的主要作用是存储键值对.由于是根据键得到值,所以不允许键重复.它主要有如下几个类别: HashMap: 最常用的Map,它根据键的HashCode值存储数据,根据键可 ...

  4. java util 排序_Java中常见的排序方法

    本博主要介绍Java中几种常见的排序算法: /* 排序方法的演示 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分 ...

  5. java合并排序_Java中的合并排序算法

    合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...

  6. java自然排序_Java中的自然排序顺序字符串比较 - 是内置的吗?

    String实现了Comparable,这就是Java中的自然顺序(使用类似的接口进行比较).您可以将字符串放在TreeSet中,也可以使用Collections或Arrays类进行排序. 但是,在您 ...

  7. java线程排序_Java中的并发排序

    我目前正在开发一个程序来同时对字符串进行排序.我的程序接收一个文件,将文件的每一行读入一个数组,并将字符串数组拆分成较小的字符串数组.然后,程序为每个较小的数组启动一个线程,并对它们进行快速排序.每个 ...

  8. java自动排序_java中的自动排序集合 ---- 20160809

    TreeSet的实现: TreeMap实现: 需要注意: 1. 当利用comparator比较两个元素相等时,插入的时候会失败.而hashset是发现两个元素相等(即:两个元素的hashcode相同, ...

  9. java中对象排序_java中 对象的排序

    1:排序类 package com.tixa.bad.customer.util; import java.util.ArrayList; import java.util.Collections; ...

最新文章

  1. 从实验室走向大众,一文读懂Nanopore测序技术的发展及应用
  2. 【AutoML】激活函数如何进行自动学习和配置
  3. C#深度优先做数字的全排列
  4. STM32 USB虚拟串口原理(上)
  5. 与Linus Torvalds“并列”,虚拟化天才程序员法布里斯贝拉
  6. java tld 方法重载_自定义标签
  7. 前端性能测试--启动时间监控数值获取方法
  8. 什么是mixin,为什么它们有用?
  9. Asp.net发布网站
  10. UE4 InputMode无法锁定编辑器视口鼠标解决方案
  11. 华为设备配置LDP与IGP联动
  12. c语言36块砖36人搬答案编程,在C语言中.36块砖,36人搬;男搬4,女搬3,两个小孩抬一块.要求一次搬完,问男女小孩各多少?设计程序....
  13. 微博android升级7.000,华为 Android 7.0 升级计划曝光:G9 青春版 /Nova 也有份
  14. 支付宝支付二维码显示在商家网站页面,不跳转到支付宝?
  15. 当程序员转行去做销售
  16. 数据分析总结四:可视化与数据分析
  17. NodeJS C++ Addons之C++类实例包装与异步操作
  18. 大佬们的“受锤”往事
  19. h5调用摄像头+拍照+上传图片-----h5+js+ajax
  20. SQL Server T-SQL数据查询

热门文章

  1. linux内核配置与编译
  2. 谨慎用药!这些药千万不能混在一起吃
  3. .NET错误:未找到类型或命名空间名称
  4. Linq to SQL学习
  5. .Net线程问题解答
  6. 云服务如何搭建数据库_【MySQL8.0.18】阿里云服务器上搭建MySQL数据库
  7. [Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算
  8. iOS逆向之Protocol Witness Table的汇编实现原理
  9. 【机器视觉】 Halcon设置自动保存
  10. 【Qt】窗口组件和窗口类型