写点什么

4 招搞定 Java List 排序

  • 2023-08-16
    广东
  • 本文字数:2280 字

    阅读完需:约 7 分钟

在开发 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<Map<String, Object>> 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<Map<String, Object>> getMapComparator(List<Map<String, Object>> 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<Map<String, Object>>;参数描述: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 下载安装。

用户头像

飞算云智官方账号 2021-08-10 加入

想了解更多产品内容,欢迎关注微信公众号:飞算SoFlu软件机器人 免费试用申请:http://feisuanyz.mikecrm.com/9dW4GeZ

评论

发布
暂无评论
4 招搞定 Java List 排序_SoFlu软件机器人_InfoQ写作社区