Java List集合 -- 最常用的两种排序方法

Comparator几种方法的详细用法 在上面的例子中,我们首先创建了一个包含多个字符串和null的List,然后使用nullsLast方法创建了一个自然顺序比较器,并将其传递给Collections.sort方法,以便对List进行排序。Comparator中的nullsLast方法用于定义当比较的对象为null时,应该如何进行比较。Comparator是Java中的一个接口,它定义了用于比较两个对象的方法。如果两个对象相等,则返回true;可以看到,在排序后的List中,所有的字符串都按照自然顺序进行排列,而null值则被排在了最后面。 阅读详情

 现在有一个类

public class Person {

    private int id;
    private int age;
    private String name;

    public Person(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }
    
    public int getId() {
        return id;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

}

一个列表

public class Test {

    public static void main(String[] args) {
        List<Person> list = new ArrayList<Person>() {{
            add(new Person(1, 30, "北京"));
            add(new Person(2, 20, "西安"));
            add(new Person(3, 40, "上海"));
        }};
    }
    
}

我们对该列表进行排序,则有如下两种最常用的方法

一、继承 Comparable 接口

我们让 Person 类实现 Comparable 接口,重写 compareTo 方法

public class Person implements Comparable<Person>{

    private int id;
    private int age;
    private String name;

    public Person(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Person person) {
        //这是从小到大排序,如果是person.getAge() - this.getAge() 则是从大到小排序
        return this.getAge() - person.getAge();
    }
}

调用 Collections.sort(list) 方法进行排序

public class Test {

    public static void main(String[] args) {
        List<Person> list = new ArrayList<Person>() {{
            add(new Person(1, 30, "北京"));
            add(new Person(2, 20, "西安"));
            add(new Person(3, 40, "上海"));
        }};

        Collections.sort(list);

        list.forEach(person -> System.out.println(person));
    }

}

运行结果

二、使用 Comparator比较器 排序

使用 Comparator比较器 无序修改原有的类,更加方便

我们查看 Collections 的 sort 方法

这边第二个参数就是我们要传入的比较器 Comparator

查看比较器源码 

我们看到 比较器 是一个接口,且有 @FunctionalInterface 注解,表明是函数式接口,者我们可以直接使用 Lambda 表达式

 Person 类无需再额外实现接口

public class Person{

    private int id;
    private int age;
    private String name;

    public Person(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

直接使用 Comparator 比较器 如下

public class Test {

    public static void main(String[] args) {
        List<Person> list = new ArrayList<Person>() {{
            add(new Person(1, 30, "北京"));
            add(new Person(2, 20, "西安"));
            add(new Person(3, 40, "上海"));
        }};

        Collections.sort(list,(Person person1,Person person2) -> {
            return person1.getAge() - person2.getAge();
        });

        list.forEach(person -> System.out.println(person));
    }

}

 

 接着我们看 idea 将比较器置灰,并提示 Can be replaced with 'Comparator.comparingInt' 

 因为 Comparator 已经有现成的 从小到大排序 方法,直接Replace

Collections.sort(list, Comparator.comparingInt(Person::getAge));

运行结果正确 

Java的List集合对象插入排序 需求背景,在一个循环里,每次循环出一个对象,将这个对象存放到另一个集合中,且另一个集合需要根据对象的某个属性的大小进行排序。 类似如下的集合 //RelateCountMatrixEntity对象,属性如下 private String xAxis; private String yAxis; private Integer count; private double relateScore; //RelateCountMatrixEntity对象集合 List<RelateCountMatrixEn 阅读详情

相关推荐

224G PAM-4 通道的 PCB 和封装设计

该行业正在努力实现层厚非常低的 sub-Dk = 3 材料,以及更先进的加工,这将使封装和 PCB 中的透射电镜截止值更高。当回波损耗占主导地位时,我们基本上需要去除沿互连产生阻抗失配的任何元件,就像上面描述的更光滑的铜和更低的 Dk 值一样。第二个影响是传输线阻抗匹配在 56 GHz 范围内的非常高的频率下非常困难的主要原因之一,另一个因素是 Tx 或 Rx 封装/缓冲器中的寄生效应。由于 PCB 和封装中的长度刻度,这是 BGA 上的焊盘、过孔和球等小结构开始在输入阻抗中产生明显偏差的频率范围。

jkh920184196的博客 840

java 两个list排序_java实现两个不同list对象合并后并排序

工作上遇到一个要求两个不同list对象合并后并排序1、问题描述从数据库中查询两张表的当天数据,并对这两张表的数据,进行合并,然后根据时间排序。2、思路从数据库中查询到的数据放到各自list中,先遍历两个list,存到主list中,然后根据各自list的对象属性time属性排序。3、需要技术Java API针对集合类型排序提供了两种支持:Java.util.Collections.sort(java...

weixin_35450193的博客 2382

WSL 相关命令时遇到了 “无法从raw.githubusercontent.com提取分发列表、操作超时

核心问题:国内网络屏蔽raw.githubusercontent.com,导致WSL无法获取发行版列表;最优方案:优先用方案1(手动指定发行版安装),无需改配置,1分钟搞定;永久修复:用方案2(修改hosts),适合需要管理多个WSL发行版的场景;兜底方案:用方案3(手动下载安装包),适配所有网络环境。按以上步骤操作后,你不仅能正常安装WSL,等命令也能正常执行,后续可正常使用WSL搭配Docker Desktop(如切换WSL 2后端),无需再担心网络超时问题。

weixin_39766667的博客 2133

IDEA报错集合(自用>>>持续更新)

自用>>>持续更新

叶 1372

保姆级教程:用NFS把群晖NAS的文件夹挂到Ubuntu 22.04上,实现文件无缝共享

本文提供了一份详细的教程,指导用户如何通过NFS协议将群晖NAS的文件夹挂载到Ubuntu 22.04系统上,实现文件的无缝共享。文章对比了NFS与SMB协议的性能差异,并提供了群晖端和Ubuntu端的配置指南、高级参数优化、自动挂载方案以及生产环境中的实战技巧,帮助用户提升文件共享效率和系统稳定性。

weixin_29213827的博客 405

XILINX偶然加载不成功的问题原因及解决方法

本文为明德扬原创文章,转载请注明出处! 一、项目背景 明德扬(MDY)在2021年承担了多个基于XILINX芯片的研发项目,包括VPX网络透明传输项目(芯片为XC7K325T-2FBG900)、某高端测试仪项目(芯片为XCKU060-FFVA1156)、某网闸设备项目(芯片为XC7Z030-FBG676)等,另外,明德扬自研了基于XC7K325T-2FBG900和基于XC7K410T-2FBG900芯片的核心板,在XILINX研发领域拥有丰富的经验。即使拥有丰富经验和积累,每个新项目我们均...

6036

Java对两个对象组成的List集合进行排序

//注:有两个对象数据组成的list集合做成滑动list显示功能“我的工具包”去找;(统一支付程序中交易明细部分) /** * 把查询回来数据放入总的集合中 */ public void getList() { mListAll = new ArrayList<>();//重新赋值,避免多次显示 offset += mListItems.size(); o...

zfr_xuexiao66的博客 1500

特斯拉 Model 3解析(八)全面拆解特斯拉自动驾驶大脑:AP控制器硬核技术解析

算力极限:双FSD = 144 TOPS,专为AI推理优化。存储架构:LPDDR4 + NAND + NOR,保证高速/可靠启动。通信架构:以太网传视频,CAN传控制,TSN保障实时性。感知输入:多路摄像头 + 高速SerDes,满足全景感知。电源设计:功率模块+被动元件海洋,稳定性优先。功能安全:双芯片冗余 + GPS + 紧急呼叫,容错率极高。🎯 在我看来,特斯拉AP控制器就是一台“车载超算”,它在电源设计、存储架构和功能安全上远超一般新势力方案。

weixin_43199439的博客 1440

如何根据对象的属性,对集合(list / set)中的对象进行排序

如何根据对象的属性,对集合(list / set)中的对象进行排序 一:针对list 通过java.util.Collections的sort方法,有2个参数,第一个参数是list对象,第二个参数是new Comparator<...

369

37.华为路由器:loopback(本地回环)接口的作用

本地环回接口(或地址),亦称回送地址(loopback address)。 此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。常见于如下用途: 1 作为一台路由器的管理地址 系统管理员完成网络规划之后,为了方便管理,会为每一台路由器创建一个loopback 接口,并在该接口上单独指定一个IP 地址作为管理地址 ,管理员会使用该地址对路由器远程登录(telnet ),该地址实际上起到了类似设备名称一类的功能。 但是通常每台路由器上存在众多接口和地址,为何不从当中随便挑选一个呢 ? 原因如下:由于

迷逝 3万+

MFC实现图书管理系统(附完整源码)

MFC实现图书管理系统(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 800

List集合的各种排序

在Java编程中,经常要对List集合进行排序,因此对List排序的各种情况进行总结,希望对各位读者有所帮助。 1.单属性变量List排序 1.1按照变量属性升序,降序排序 /** * 单属性变量list 自身属性升序, 降序排序 */ private void singleVariableSort1(){ List&lt;Integer&gt; list...

yuanfang0907的博客 11万+

后台管理系统-7-vue3之引入配置文件baseURL

mock=false,本地模拟。mock=true,线上模拟。baseURL+url=实际请求的URL。get请求param参数,post请求data参数。

qq_20466211的博客 207

Java集合之List(超详细)

for-each循环:简洁易读,最适合日常使用。Iterator:提供了更多的控制权,比如在遍历时移除元素,但在大多数情况下不如for-each方便。Stream API:功能强大,支持复杂的集合处理和并行处理,适合进行复杂的聚合操作和过滤操作。

epitomizelu的专栏 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java中list集合对sort的使用方法

List集合的排序: java提供了两种排序方式,分别是Collections.sort(List)和Collections.sort(List,Commparator),下面就这两种方法的使用做详细的说明: 方法一:Collections.sort(List) 这个方法有分两种情况:1、比较的是基础数据 2、比较的是引用数据 1、基础数据的比较呢,一般都是直接比较,因为基础数据都...

大王的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java中的各种集合排序之set中TreeSet集合排序

一、背景 1.软件开发过程中集合排序是比较强大的功能,会使用集合Map、Set、List实现排序功能,知道匿名内部类Comparator很关键,搞清楚集合排序的性能开销,排序遇到的坑以及解决的方法,注意下面的例子都是JDK1.8的用法。 二、Set集合排序 1.UML类图 三、注意点 1.我们先来说下集合的各个特点: 2.List的主要特点以及用法 2.1.可以允许存储重复的对象...

码农小默 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java集合对List进行排序

方式1:JAVA中我们可以使用java.util.Collections类的sort(List list)方法对list集合中的元素排序。方式2:JDK8之后特别是lambda表达式的盛行,而且Collections的sort方法其实是调用了List接口自己的sort方法;所以可以使用List接口自己的sort方法排序方式3:方式2的lambda写法方式4:Stream流的sort方法写法例如:对User对象集合根据User类的sex属性排序,默认是升序实现:1.首先你需要进行流处理,使用。

qq_43391689的博客 6398

Java之List集合三种排序方式

Java之List集合三种排序方式方式一(Integer类型集合排序)方式二(对象类型集合排序)方式三(同样是对象类型集合排序 ) 方式一(Integer类型集合排序) public static void main(String[] args) { List<Integer> nums = new ArrayList<Integer>(); nums.add(3); nums.add(5); nums.add(1); nums.add(0); System.out.pr

ZwLemon 4180

Java List集合排序 Java8 List集合排序方法 Java Lambda集合排序

一、概述 Java中集合排序,在Java8之前,可以通过 Collections类的sort方法进行排序;Java8之后,新增 lambda和stream ,都增加了相关的排序方法,本文将整理下常见的三种排序方法。 分别是:二、准备工作 1、创建一个User类,相关属性如下: 2、单元测试类,准备工作 三、List接口中sort方法排序 1、List.sort方法排序 2、多条件排序 四、Stream中的

HaHa_Sir的博客 7848

Java中List排序的3种方法

本文介绍了 3 种 List 排序的方法,前两种方法常用于 JDK 8 之前的版本,其中比较器 Comparator 有两种实现的写法,而在 JDK 8 之后的版本,就可以使用 Comparator.comparing 实现排序了,如果排序字段中可能出现 null 值,要使用 Comparator.nullsXXX 进行排序处理(否则会报错)

折翼的青鸟 2万+

list字母排序 java_通过Java排序List集合的元素的几种方法

用Java工具类Collections的sort()方法,对List集合元素进行排序。Collections提供两种排序方法:一、Collections.sort(List list);此方法需要泛型T这个Bean实现Comparable接口,并且实现compareTo()方法排序;二、Collections.sort(List list, Comparator super T> c);此方...

weixin_31695145的博客 2345

List集合序列排序的两种方法

首先讲一下Comparable接口和Comparator接口,以及他们之间的差异。有助于Collections.sort()方法的使用。请参考1.Comparable自然规则排序 //在自定义类Student里面实现Comparable接口,并重写抽象方法compareTo(Student o); //Collections.sort(集合); 先看一个简单的例子: public st...

diweikang的博客 24万+

JAVA集合的Sort排序方法

sort方法排序默认是升序 ASC 方式1:JAVA中我们可以使用java.util.Collections类的sort(List<T> list)方法对list集合中的元素排序。 方式2:JDK8之后特别是lambda表达式的盛行,而且Collections的sort方法其实是调用了List接口自己的sort方法;所以可以使用List接口自己的sort方法排序 方式3:方式2的...

WannaRunning的博客 6876

在java中对LIst集合的两种排序方法(即sort的使用方法)

List集合的排序: java提供了两种排序方式,分别是Collections.sort(List)和Collections.sort(List,Commparator),下面就这两种方法的使用做详细的说明: **-Collections.sort(List);** sort的参数是一个List集合,对List集合中的数据排序,这个方法有两种情况. 第一种情况是:如果Lis...

qq_36239350的博客 5万+

如何对List集合按照对象的某一属性排序

在进行软件构造实验三的过程中,遇到了对List集合按照对象的某一属性排序的问题,我们知道,在一般的情况下,java中提供了对集合进行操作的工具类Collections, Collections能够对集合中的元素用默认的排序方法sort来根据元素的自然顺序对指定集合按升序进行排序。 对于常用的java自带的类: 在java中,很多类自己实现好了Comparable接口,并且重写了comepareTo方法,所以我们可以直接调用方法就可以实现排序。我们拿Integer类来举例子: import java.ut

飞了一半的涛的博客 5666
上一篇: HashSet 、LinkedHashSet 源码级详解
下一篇: volatile 关键字 (详细解析)
Fearless____
博客等级 码龄5年 14粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值