首页 > 编程语言 >Java中List排序的4种方法

Java中List排序的4种方法

时间:2023-08-16 17:33:03浏览次数:46  
标签:map Java comparator get List arrCols 排序

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

标签:map,Java,comparator,get,List,arrCols,排序
From: https://blog.51cto.com/u_15327851/7111419

相关文章

  • Java如何检查文件是目录还是文件?
    开发过程中经常会遇到读取文件内容的情况,需要判断文件是否为文本文件,及文件编码格式,防止无法读取内容或乱码出现情况。我们可以通过java.io.File类包找出文件是目录还是常规文件。java.io.File类包含两种方法,它们分别是:• isFile():如果文件存在并且是常规文件,则此方法返回true;如......
  • JavaScript实现大文件上传
    ​ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现。下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压。ASP.NET页面设计:TextBox和Button按钮。 ​编辑TextBox中需要自己受到输入文件夹的路径(包含文件夹),通过Button......
  • springmvc 开启异步请求报错 Java code using the Servlet API or by adding "true"
    报错内容:java.lang.IllegalStateException:Asyncsupportmustbeenabledonaservletandforallfiltersinvolvedinasyncrequestprocessing.ThisisdoneinJavacodeusingtheServletAPIorbyadding"true"toservletandfilterdeclarationsin......
  • Java中对象的序列化和反序列化方法
     Java中要序列化一个对象,必须与一定的对象I/O流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。 java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象。在ObjectInputStream中用readObject()方法可以直接读取一......
  • 推荐一个面向对象的javascript框架mootools
    MooTools是一个简洁,模块化,面向对象的开源JavaScriptweb应用框架。浏览器支持:支持IE6以上,也支持firefox,safari等与jQuery、Prototype、YUI、Dojo几个更有名的相比,它的优点在:优点:1.灵活,模块化的框架,用户可以选择自己需要的组件。2.MooTools符合OO的思想,使代码更强壮,有力,有效。适合......
  • 机器是否联网的javascript的判断方法介绍
    在很多场景下,只有机器已经联网以后,web应用才能启动。如果没有联网,就会提示错误。、但是机器有时候要重启。如果机器重启后,立刻启动web应用的话,可能,机器上的网络服务还没有准备好。特别是windows7,启动网络服务需要好几秒,这个时候怎么办呢? 之前尝试过几种方法:比如通过ping来判断,......
  • 【校招VIP】java语言考点之List和扩容
    考点介绍:List是最基础的考点,但是很多同学拿不到满分。本专题从两种实现子类的比较,到比较复杂的数组扩容进行分析一、考点题目1、以下关于集合类ArrayList、LinkedList、HashMap描述错误的是:A.HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值B.Array......
  • 冒泡排序
    冒泡排序-时间复杂度为O(n2)publicclassDemo{publicstaticvoidmain(String[]args){int[]a={3,23,12,3,423,22,4,534,66,34};System.out.println(Arrays.toString(sort(a)));}//冒泡排序//1比较数组中,两个相邻的元素,如......
  • JavaScript – Alpine.js
    前言Alpine是高山的意思。Alpine.js是一个轻量级的JSFramework。我为什么会去用它呢?是这样的,我在做企业网站开发的时候会有2个阶段。第一个draft阶段,只写HTML、CSS、JS。不会涉及ASP.NETCore、SQLServer。第二个阶段就是final,会引入ASP.NETCore、SQLServer......
  • 计数排序(Python)
    defcounting(data):"data里的value作为计数数组counts的index,然后把counts的value转换成data的index"#计数列表,存储每个值有多少个,以data的值作为索引,所以数组长度以最大值+1为准counts=[0foriinrange(max(data)+1)]#同时给数组赋初值0,等会逐个计数......