4 招搞定 Java List 排序

简介: 在开发 ERP 或电商系统中,经常会遇到内容加密,生成签名,展示页面列表等功能场景,这个时候我们需要在 Java 程序中对 List 集合进行排序操作。

在开发 ERP 或电商系统中,经常会遇到内容加密,生成签名,展示页面列表等功能场景,这个时候我们需要在 Java 程序中对 List 集合进行排序操作。

排序的常见方法有以下 4 种:

  1. 使用 Comparable 进行排序;

  2. 使用 Comparator 进行排序;

  3. JDK 8 以上的环境,可以使用 Stream 流进行排排序;

  4. JDK8 之后特别是 lambda 表达式的盛行,而且 Collections 的 sort 方法其实是调用了 List 接口自己的 sort 方法;所以可以使用 List 接口自己的 sort 方法排序。

本文将以两种不同开发形式是如何通过 Comparator 及 Collection.sort 两种方法实现 List 排序为例进行讲解。

人工编写:使用 Comparator 排序
一位中级 Java 开发工程师遇到 List 排序需求后,选择使用能对不同类型的对象进行排序,也不用自己实现排序算法的 Comparator 方法,一般需要花费 15 分钟左右的时间。

代码如下:

public static void sort(List> list, String columns, String order) {

String[] arrCols = columns.split(REGEX);

Stream<Map<String, Object>> stream = list.stream();

Comparator<Map<String, Object>> comparator = getMapComparator(list, arrCols, order);

List<Map<String, Object>> updateList =    stream.sorted(comparator).collect(Collectors.toList());

list.clear();

list.addAll(updateList);

}

private static Comparator> getMapComparator(List> list, String[] arrCols, String order) {

Comparator<Map<String, Object>> comparator;

if (list.get(0).get(arrCols[0]) instanceof Integer) {

    comparator = Comparator.comparingInt((Map<String, Object> map) -> Integer.valueOf(map.get(arrCols[0]).toString()));

} else if (list.get(0).get(arrCols[0]) instanceof Long) {

    comparator = Comparator.comparingLong((Map<String, Object> map) -> Long.valueOf(map.get(arrCols[0]).toString()));

} else if (list.get(0).get(arrCols[0]) instanceof Double) {

    comparator = Comparator.comparingDouble((Map<String, Object> map) -> Double.valueOf(map.get(arrCols[0]).toString()));

} else {

    comparator = Comparator.comparing((Map<String, Object> map) -> String.valueOf(map.get(arrCols[0])));

}

// 降序

if (order.equals(ORDER_DESC)) {

    comparator = comparator.reversed();

}

// 排除第一个

for (int i = 1; i < arrCols.length; i++) {

    int f = i;

    if (list.get(0).get(arrCols[f]) instanceof Integer) {

        comparator = comparator.thenComparingInt((Map<String, Object> map) -> Integer.valueOf(map.get(arrCols[f]).toString()));

    } else if (list.get(0).get(arrCols[f]) instanceof Long) {

        comparator = comparator.thenComparingLong((Map<String, Object> map) -> Long.valueOf(map.get(arrCols[f]).toString()));

    } else if (list.get(0).get(arrCols[f]) instanceof Double) {

        comparator = comparator.thenComparingDouble((Map<String, Object> map) -> Double.valueOf(map.get(arrCols[f]).toString()));

    } else {

        comparator = comparator.thenComparing((Map<String, Object> map) -> String.valueOf(map.get(arrCols[f])));

    }

    // 如果是降序每次都设置降序

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

        comparator = comparator.reversed();

    }

}

return comparator;

}

FuncGPT(慧函数) 函数 AI 生成器:使用 Collection.sort 排序
Collection.sort() 用来对集合进行排序,其中 sort 和冒泡排序差不多,sort 方法是不断的遍历 List,比较 List 的任意相邻两个元素,看看这两个相邻的元素是否发生交换。如果 List 中任意两个元素都不会发生交换,说明排序结束。

看下 FuncGPT 是如何通过 Collection.sort 实现 List 排序:

在使用界面输入具体的需求及参数要求:

函数功能:List 排序

参数 1:参数名称:list;参数类型:List>;参数描述:List 对象

参数 2:参数名称:columns;参数类型:String;参数描述:排序字段名,以 / 分隔;

参数 3:参数名称:order;参数类型:String;参数描述:排序类别 asc 顺序,desc 倒序

返回值:不为空值

总结
本文介绍了 2 种 List 排序的方法,Comparator 常用于 JDK 8 之前的版本,而在 JDK 8 之后的版本,就可以使用 Collection.sort 实现排序了。

此外,值得一提的是,2 种 List 排序方法是分别通过人工编写以及 FuncGPT (慧函数) 函数 AI 生成器两种不同形式实现的。如果对这两个代码进行对比分析,会发现:

一、效率方面,原本人工编码需要 15 分钟左右,AI 工具只需 24 秒,秒级函数生成,效率实现了大幅提升;

二、人工编写的代码结构胶复杂,包含条件判断和逻辑分支;而 AI 工具因为使用 Collection.sort 方法进行排序,直观简单,代码可读性优于人工编码;

三、人工编写的代码没有判断空值或者空格,存在漏洞,而 AI 工具利用了 Apache Commons Lang 库中的 StringUtils 工具类判断表达式是否为空或空格,代码的健壮度更好。

作为飞算 SoFlu 软件机器人的一个重要组成部分,FuncGPT(慧函数)支持所有类型函数创建。通过自然语言描述 Java 函数需求,实时生成高质量、高可读性的 Java 函数代码。生成代码可直接复制到 IDEA,或一键导入 Java 全自动开发工具函数库。

FuncGPT(慧函数)免费开放中,点击链接 http://suo.im/aREPi 下载安装。

相关文章
|
3月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
69 5
|
3月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
56 3
|
3月前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
31 1
|
2月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
48 0
|
3月前
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
34 1
|
4月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
26 3
|
5月前
|
Java
用JAVA架建List集合为树形结构的代码方法
这段代码定义了一个表示树形结构的 `Node` 类和一个用于构建树形结构的 `TreeController`。`Node` 类包含基本属性如 `id`、`pid`、`name` 和 `type`,以及子节点列表 `children`。`TreeController` 包含初始化节点列表并将其转换为树形结构的方法。通过过滤和分组操作实现树形结构的构建。详情可见:[代码示例链接1](http://www.zidongmutanji.com/zsjx/43551.html),[代码效果参考链接2](https://www.257342.com/sitemap/post.html)。
49 5
|
4月前
|
Java API 开发者
代码小妙招:用Java轻松获取List交集数据
在Java中获取两个 `List`的交集可以通过 `retainAll`方法和Java 8引入的流操作来实现。使用 `retainAll`方法更为直接,但会修改原始 `List`的内容。而使用流则提供了不修改原始 `List`、更为灵活的处理方式。开发者可以根据具体的需求和场景,选择最适合的方法来实现。了解和掌握这些方法,能够帮助开发者在实际开发中更高效地处理集合相关的问题。
110 1
|
5月前
|
存储 Java
Java中ArrayList 元素的排序
本文提供了Java中根据`ArrayList`元素的某个属性进行排序的示例代码,包括实现`Comparable`接口和重载`compareTo`方法,然后使用`Collections.sort`方法进行排序。
|
5月前
|
存储 Java API
【Java高手必备】揭秘!如何优雅地对List进行排序?掌握这几种技巧,让你的代码瞬间高大上!
【8月更文挑战第23天】本文深入探讨了Java中对List集合进行排序的各种方法,包括使用Collections.sort()、自定义Comparator以及Java 8的Stream API。通过示例代码展示了不同情况下如何选择合适的方法:从简单的整数排序到自定义类对象的排序,再到利用Comparator指定特殊排序规则,最后介绍了Stream API在排序操作中的简洁应用。理解这些技术的区别与应用场景有助于提高编程效率。
137 4