4 招搞定 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 排序为例进行讲解。

  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 下载安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/69430.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS自学框架之表单

首先我们看一下表单样式&#xff0c;下面共有5张截图 一、CSS代码 /*表单*/fieldset{border: none;margin-bottom: 2em;}fieldset > *{ margin-bottom: 1em }fieldset:last-child{ margin-bottom: 0 }fieldset legend{ margin: 0 0 1em }/* legend标签是CSS中用于定义…

jvm——垃圾回收机制(GC)详解

开始之前有几个GC的基本问题 什么是GC&#xff1f; GC 是 garbage collection 的缩写&#xff0c;意思是垃圾回收——把内存&#xff08;特别是堆内存&#xff09;中不再使用的空间释放掉&#xff1b;清理不再使用的对象。 为什么要GC&#xff1f; 堆内存是各个线程共享的空间…

android wifi扫描 framework层修改扫描间隔

frameworks/opt/net/wifi/service/java/com/android/server/wifi/ScanRequestProxy.java 这个也就是说前台应用可以在120s(2分钟) 扫描 4 次 * a) Each foreground app can request a max of* {link #SCAN_REQUEST_THROTTLE_MAX_IN_TIME_WINDOW_FG_APPS} scan every* {l…

辽宁线上3D三维虚拟工厂生产仿真系统应用场景及优势

工厂虚拟仿真是一种基于计算机技术和虚拟现实技术的数字化解决方案&#xff0c;它可以通过模拟工厂中的设备、流程和操作&#xff0c;来为工程师和操作人员提供了一个沉浸式的虚拟环境&#xff0c;帮助他们更好地了解和优化工厂生产过程。 工厂VR三维可视化技术为工业生产提供了…

ios swift alert 自定义弹框 点击半透明部分弹框消失

文章目录 1.BaseAlertVC2.BindFrameNumAlertVC 1.BaseAlertVC import UIKitclass BaseAlertVC: GLBaseViewController {let centerView UIView()override func viewDidLoad() {super.viewDidLoad()view.backgroundColor UIColor(displayP3Red: 0, green: 0, blue: 0, alpha:…

Spring相关面试题

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱写博客的嗯哼&#xff0c;爱好Java的小菜鸟 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;个人博客&#xff1a;敬请期待 &#x1f4d5;系列…

拒绝摆烂!C语言练习打卡第二天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4dd;…

(十六)大数据实战——安装使用mysql版的hive服务

前言 hive默认使用的是内嵌据库derby&#xff0c;Derby 是一个嵌入式数据库&#xff0c;可以轻松地以库的形式集成到应用程序中。它不需要独立的服务器进程&#xff0c;所有的数据存储在应用程序所在的文件系统中。为了支持hive服务更方便的使用&#xff0c;我们使用mysql数据…

单片机直驱两相四线步进电机研究

【本文发布于https://blog.csdn.net/Stack_/article/details/132236329&#xff0c;未经允许不得转载&#xff0c;转载须注明出处】 双极性步进电机&#xff08;两相四线步进电机&#xff09;&#xff0c;原理的东西就先不讲太多了&#xff0c;还没搞清楚&#xff0c;边查资料边…

iTOP-i.MX8M开发板添加USB网络设备驱动

选中支持 USB 网络设备驱动&#xff0c;如下图所示&#xff1a; [*] Device Drivers→ *- Network device support → USB Network Adapters→ {*} Multi-purpose USB Networking Framework 将光标移动到 save 保存&#xff0c;如下图所示&#xff1a; 保存到 arch/arm64/c…

基于注意力神经网络的深度强化学习探索方法:ARiADNE

ARiADNE:A Reinforcement learning approach using Attention-based Deep Networks for Exploration 文章目录 ARiADNE:A Reinforcement learning approach using Attention-based Deep Networks for Exploration机器人自主探索(ARE)ARE的传统边界法非短视路径深度强化学习的方…

ppt中线材相交接的地方,如何绘画

ppt中线材相交接的地方&#xff1a; 在ppt中绘画线材相互交接的地方&#xff1a; 1.1绘图工具中的“弧形” 1.2小技巧 “弧形”工具点一下&#xff0c;在ppt中如下 1.3拖动活动点进行调整图形 1.4绘画圆弧 1.5调整“圆弧”的大小&#xff0c;鼠标放在“黄色点”位置&#xf…