4招搞定Java List排序

原创
2023/08/16 17:19
阅读数 354

在开发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排序为例进行讲解。

 

  1. 人工编写:使用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;

}

 

  1. 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倒序

返回值:不为空值

  1. 总结

本文介绍了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下载安装。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部