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

news2024/10/5 23:27:10

 现在有一个类

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));

运行结果正确 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

149206-86-0,DOTA GGGA,双功能螯合物,修饰在多肽上的螯合剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 规格单位&#xff1a;g |货期&#xff1a;按照具体的库存进行提供 | 纯度&#xff1a;95%| PART1-------试剂描述&#xff1a; 螯合剂Dota-ggga&#xff08;CAS号&#xff1a;149206-86-0&#xff09;&#xff0c;螯合…

skbuff.h在哪

今天看来下底层socket的实现&#xff0c;发现很多人都说有个skbuff结构&#xff0c;我就想着去找下这个&#xff0c; cat /include/linux/skbuff.h 结果找不到&#xff0c;查了下&#xff0c;需要下载内核源码 //Ubuntusudo apt install linux-headers-genericdpkg -S skbuff.…

Linux系统配置Node.js环境详细教程(图文讲解)

前言&#xff1a;在使用Jenkins部署Vue项目的时候&#xff0c;如果没有安装Node.js环境的话&#xff0c;Jenkins会无法对Vue项目进行构建&#xff0c;所以本期出了一篇关于在Linux系统如何配置Node.js环境的讲解&#xff0c;以博客的方式记录一下我详细的配置流程和踩过的坑&am…

包的使用及其创建

文章目录 前言类名冲突完整的类路径创建包导入类包总结 前言 java语言中&#xff0c;包在整个管理过程中发挥了重要的作用。使用包&#xff0c;可以有效地管理繁多的类文件&#xff0c;解决了类名重复的问题。在类中应用包和权限修饰符&#xff0c;可以控制他人对类成员的方法的…

旅游卡系统加盟代理软件开发

旅游行业的不断发展&#xff0c;越来越多的旅行社开始推出各种优惠卡来吸引游客。而随着智能手机的普及&#xff0c;开发一款旅行社优惠卡APP软件成为了一种必然的趋势。 该软件的主要功能是提供旅行社的各种优惠卡信息&#xff0c;包括优惠卡的种类、价格、使用范围、有效…

【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 螺旋矩阵 II

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来螺旋矩阵的分享✨ 目录 前言59. 螺旋矩阵 II54. 螺旋矩阵总结 59. 螺旋矩阵 II 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n…

用微服务架构推进企业数字化转型升级

随着数字化转型进入深水区&#xff0c;企业应用程序建设需求急剧增长且变化多端&#xff0c;软件架构经历了单体结构、垂直架构、SOA架构&#xff0c;发展到了现在的微服务架构。 单体架构目前应用较多&#xff0c;部署容易&#xff0c;但单体式应用内部包含了所有需要的服务&…

四、DML-3.数据操作-删除

delete不能删除某个字段的值 若要删除某个字段的值&#xff0c;用update&#xff0c;将该字段设置为null 原数据表&#xff1a; 一、案例一 删除gender为女的员工 delete from employee where gender 女; 步骤一&#xff1a;输入delete命令并执行&#xff1a; 步骤二&#…

【Python】通过第三方库wxauto自动化操作微信电脑客户端

文章目录 一.简介二.wxauto提供的函数1.WxUtils类功能函数&#xff1a;2.WeChat类主要函数&#xff1a; 三.使用四.遇到的问题 一.简介 wxauto是一个Python第三方库&#xff0c;用于自动化操作微信电脑客户端通过wxauto&#xff0c;我们可以使用Python编写脚本&#xff0c;实现…

如何自学网络安全(黑客)

自学网络安全&#xff08;黑客&#xff09;需要掌握一系列的技能和知识&#xff0c;以下是一些学习网络安全的步骤&#xff1a; 基础知识&#xff1a;首先&#xff0c;你需要对计算机网络和操作系统有基本的了解。学习计算机网络的基本原理、网络协议和网络安全的基本概念。同时…

攻防世界-web-easytornado

题目描述&#xff1a;Tornado 框架。打开链接是一个简单的界面 1. 思路分析 看到有个/flag.txt&#xff0c;我们点击进去看下 发现传入了两个参数&#xff0c;一个是filename&#xff0c;还有一个是filehash 看到里面的内容&#xff0c;提示我们真正的flag在 /flllllllllllla…

报错 The server socket has failed to bind to [::] Pytorch中DDP中断训练报错

Pytorch中DDP &#xff1a;The server socket has failed to bind to [::]:29500 (errno: 98 - Address already in use&#xff09;_cv_lhp的博客-CSDN博客 报错如下 The server socket has failed to bind to [::]:999 (errno: 98 - Address already in use) 这个错误是因为…

虚拟机挂载USB设备/USB serial 连接开发板

虚拟机挂载USB设备 1、添加USB设备 2、终端输入&#xff1a;sudo fdisk -l 查看Device设备&#xff1a; 3、创建挂载目录&#xff1a;mkdir /mnt/usb 4、执行挂载命令&#xff1a;sudo mount /dev/sdb1 /mnt/usb ,查看/mnt/usb目录下是否存在U盘中的数据&#xff1a; 5、用…

构建产品帮助中心时要避免的 8 个最常见错误

构建帮助中心是提供给客户和用户有价值信息的重要途径&#xff0c;但在建设过程中&#xff0c;有一些常见的错误需要避免。本文将介绍构建帮助中心时要避免的8个最常见错误&#xff0c;帮助您打造一个更优秀的帮助中心。 1. 以老式方式进行&#xff08;FAQ/Q&A 页面样式&am…

【uni-app】1、分页组件z-paging介绍与使用

1、z-paging 介绍 1、一个 uni-app &#xff08;opens new window&#xff09;分页组件。 2、全平台兼容&#xff0c;支持自定义下拉刷新、上拉加载更多&#xff0c;支持虚拟列表&#xff0c;支持自动管理空数据图、点击返回顶部&#xff0c;支持聊天分页、本地分页&#xff0c…

AI对话+AI绘画,提高你的生产力

智心AI平台 使用 Nestjs 和 Vue3 搭建的 AIGC 生态社区 在线使用&#xff1a;用户端体验 当前特色支持功能 GPT3/4模型支持与控制联网对话支持思维导图生成支持openai DALL-E2绘画支持Midjourney绘画支持全套卡密系统支持在线支付支持完善的后台管理系统支持 源码购买或者…

Unity---Spine动画

目录 1.介绍 2.优点 3.spine导出的unity资源 4.导入 5.导入报错的解决方案 6.使用 7.代码示例 1.加载Spine骨骼动画&#xff1a; 2.控制Spine动画的播放&#xff1a; 3.暂停和恢复动画播放&#xff1a; 4.监听动画事件&#xff1a; 5.切换皮肤&#xff08;换装&…

Rsync(二十七)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、特性 三、应用场景 四、数据的同步方式 五、rsync传输模式 六、rsync应用 七、rsync 命令 1. 格式 1.1 作为远程命令 1. 2 作为rsync服务 2. 选项 3.…

​通达信量比捉牛股指标源码​_通达信公式

JL5:MA(V,5); LB:DYNAINFO(17); 历史量比:IF(DYNAINFO(4)OANDDYNAINFO(5)HANDDYNAINFO(6)LANDDYNAINFO(7) C,DYNAINFO(17),V/JL5),LINETHICK,COLORYELLOW; STICKLINE(历史量比>1,历史量比,0,3,1)COLORRED; STICKLINE(历史量比<1,历史量比,0,3,0)COLO…

Debug调试的使用(IDEA 基础篇 喂奶级教程)

引言 在编程中&#xff0c;Debug&#xff08;调试&#xff09;是指在程序运行时&#xff0c;通过一系列的工具和技术&#xff0c;对程序进行逐行调试和分析&#xff0c;从而发现和修复程序中的错误和问题。Debug 功能是程序开发中非常重要的一个环节&#xff0c;它可以帮助开发…