List排序的方法
List 排序方法:
1. list 的 sort()
package com.example.a;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
class User{private Integer score;private Integer age;public User(Integer score, Integer age){super();this.score = score;this.age = age;}public Integer getScore() {return score;}public void setScore(Integer score) {this.score = score;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
public class Demo {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User(95, 26));users.add(new User(84, 23));users.add(new User(96, 25));users.add(new User(95, 24));// 单字段排序users.sort(Comparator.comparing(User::getAge));for(User user : users){System.out.println(user.getScore() + "," + user.getAge());}System.out.println("---------------------------------");// 多字段排序(法1)users.sort((o1, o2) -> {// 这里必须要在中间加分隔符。否则,若都是数字,会变成数字相加,再转为字符串String tmp1 = o1.getScore() + ":" + o1.getAge();String tmp2 = o2.getScore() + ":" + o2.getAge();return tmp1.compareTo(tmp2);});for(User user : users){System.out.println(user.getScore() + ":" + user.getAge());}System.out.println("---------------------------------");// 多字段排序(法2)users.sort((o1, o2) -> {int i = o2.getScore() - o1.getScore();if (i == 0) {return o1.getAge() - o2.getAge();}return i;});for(User user : users){System.out.println(user.getScore() + "," + user.getAge());}}
}
输出结果:
84,23 95,24 96,25 95,26 --------------------------------- 84:23 95:24 95:26 96:25 --------------------------------- 96,25 95,24 95,26 84,23
单字段排序:
在代码中,定义了 User 类包含 score 和 age 属性,创建了 ArrayList<User> 并添加了多个 User 对象实例。使用 users.sort(Comparator.comparing(User::getAge)); 语句按照 age字段对 users 列表进行排序。这里利用了 Comparator.comparing() 方法,它接收一个获取属性的函数式接口引用(此处为 User::getAge,表示按照 User 对象的 age 属性进行比较),然后sort 方法会依据这个比较逻辑对列表元素进行排序。排序后通过循环打印出每个用户的 score 和 age,结果展示了按照年龄从小到大排序后的用户信息。
多字段排序示例(法1):
使用自定义的比较逻辑,通过 lambda 表达式实现。在 lambda 表达式中,先将 User 对象的 score 和 age 组合成一个字符串(中间用:分隔,是为了避免数字直接相加等问题,保证按预期拼接字符串用于比较),如 String tmp1 = o1.getScore() + ":" + o1.getAge();,然后通过比较两个这样组合后的字符串大小(return tmp1.compareTo(tmp2);)来确定元素的顺序,实现了多字段排序效果。
多字段排序示例(法2):
同样是用 lambda 表达式实现多字段排序。先比较 score 字段(int i = o2.getScore() - o1.getScore();,通过差值判断大小,若差值为 0 则表示 score 相同),当 score 相同时,再比较 age 字段(return o1.getAge() - o2.getAge();),最终返回比较结果来确定元素顺序,按照成绩降序、年龄升序(成绩相同时)的规则对列表进行了排序。
2. JDK8 的 stream 方法
2.1 对简单整数列表进行排序
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class StreamSortExample {public static void main(String[] args) {// 创建一个包含整数的ArrayListList<Integer> numbers = new ArrayList<>();numbers.add(5);numbers.add(2);numbers.add(8);numbers.add(1);// 使用Stream的sorted方法进行排序,并通过collect方法将结果收集回ListList<Integer> sortedNumbers = numbers.stream().sorted().collect(Collectors.toList());System.out.println("排序后的整数列表: " + sortedNumbers);}
}
在上述代码中:
2.1.1. 首先创建了一个ArrayList,其中包含了几个整数元素;
2.1.2. 接着调用stream()方法将List转换为Stream流,这样就能使用流相关的操作了;
2.1.3. 然后使用sorted()方法,对于像Integer这种基本数据类型对应的包装类(因为Stream操作的是对象),它默认会按照自然顺序(在这里就是数字从小到大的顺序)对元素进行排序;
2.1.4. 最后使用collect(Collectors.toList())将排序后的流元素收集回一个新的List,并将其打印出来,运行结果会显示按照从小到大顺序排好的整数列表;
2.2 对自定义对象列表按照单个属性排序
class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class StreamSortExample {public static void main(String[] args) {// 创建一个包含Student对象的ArrayListList<Student> students = new ArrayList<>();students.add(new Student("Alice", 20));students.add(new Student("Bob", 18));students.add(new Student("Charlie", 22));// 使用Stream的sorted方法结合Comparator按照年龄对学生列表进行排序List<Student> sortedStudents = students.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());// 打印排序后的学生列表信息sortedStudents.forEach(student -> System.out.println("姓名: " + student.getName() + ", 年龄: " + student.getAge()));}
}
在上述代码中:
2.2.1. 先定义了Student类,包含name和age两个属性;
2.2.2. 创建了ArrayList<Student>并添加了几个Student实例;
2.2.3. 在使用Stream进行排序时,调用sorted方法并传入一个Comparator,这里通过Comparator.comparing(Student::getAge)来指定按照Student对象的age属性进行比较排序,也就是会按照年龄从小到大对学生列表进行排序;
2.1.4. 最后使用collect(Collectors.toList())收集排序后的元素为新的列表,并且通过forEach方法遍历打印出每个学生的姓名和年龄信息,展示排序后的结果;
2.3 对自定义对象列表按照多个属性排序
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class StreamSortExample {public static void main(String[] args) {List<Student> students = new ArrayList<>();students.add(new Student("Alice", 20));students.add(new Student("Bob", 18));students.add(new Student("Charlie", 20));// 使用Stream的sorted方法结合Comparator按照年龄和姓名对学生列表进行排序List<Student> sortedStudents = students.stream().sorted(Comparator.comparing(Student::getAge).thenComparing(Student::getName)).collect(Collectors.toList());sortedStudents.forEach(student -> System.out.println("姓名: " + student.getName() + ", 年龄: " + student.getAge()));}
}
在上述代码中:
2.3.1. 创建了包含Student对象的列表,其中有年龄相同的情况;
2.3.2. 调用sorted方法时,传入的Comparator通过链式调用thenComparing来添加额外的比较条件。首先通过Comparator.comparing(Student::getAge)按照年龄进行比较排序,然后使用.thenComparing(Student::getName)表示在年龄相同的情况下,再按照姓名的字典顺序进行排序;
2.3.3. 最后同样收集排序后的元素为新列表并遍历打印出信息,展示按照多属性排序后的结果;
法3:Comparator 的 compare()
package org.example.a;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class User{private int score;private int age;public User(int score, int age){super();this.score = score;this.age = age;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
public class Demo {public static void main(String[] args) {List<User> users = new ArrayList<User>();users.add(new User(95, 26));users.add(new User(84, 23));users.add(new User(96, 25));users.add(new User(95, 24));Collections.sort(users, new Comparator<User>() {@Overridepublic int compare(User o1, User o2) {int i = o2.getScore() - o1.getScore();if(i == 0){return o1.getAge() - o2.getAge();}return i;}});for(User user : users){System.out.println(user.getScore() + "," + user.getAge());}}
}
输出结果:
96,25 95,24 95,26 84,23
在上述代码中,ArrayList<User> 并添加了多个User对象实例,然后使用Collections.sort(users, new Comparator<User>() {... });来进行排序。这里Collections.sort()方法接收要排序的列表以及一个 Comparator 接口的实现类实例(此处通过匿名内部类的方式实现)。在 compare 方法中,先比较 score 字段(通过差值判断大小,差值为 0 表示成绩相同),若成绩相同则比较age字段,最后返回比较结果,按照成绩降序、年龄升序(成绩相同时)的规则对列表进行了排序,循环打印出排序后的用户信息展示了排序效果。
法4:Comparable 的 compareTo()
4.1 默认按增序排序:
package org.example.a;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Demo {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.println(nums);Collections.sort(nums);System.out.println(nums);}
}
输出结果:
[3, 5, 1, 0] [0, 1, 3, 5]
对于简单的 ArrayList<Integer>,创建列表并添加元素后,直接调用Collections.sort(nums);,由于Integer类实现了 Comparable 接口,其内部的 compareTo 方法定义了默认的按照数字大小的增序排序逻辑,所以列表会按照从小到大的顺序被排序,从打印结果[3, 5, 1, 0]和[0, 1, 3, 5]可以看出排序前后的变化。
4.2 自定义对象排序示例:
package org.example.a;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class User implements Comparable<User>{private int score;private int age;public User(int score, int age){super();this.score = score;this.age = age;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int compareTo(User o) {int i = o.getScore() - this.getScore();if(i == 0){return this.getAge() - o.getAge();}return i;}
}
public class Demo {public static void main(String[] args) {List<User> users = new ArrayList<User>();users.add(new User(95, 26));users.add(new User(84, 23));users.add(new User(96, 25));users.add(new User(95, 24));Collections.sort(users);for(User user : users){System.out.println(user.getScore() + "," + user.getAge());}}
}
输出结果:
96,25 95,24 95,26 84,23
定义的 User 类实现了 Comparable<User> 接口,重写了 compareTo 方法。在 compareTo方法中,先比较 score 字段(通过差值判断,不过这里是用 o.getScore() - this.getScore();实现降序效果,差值为 0 表示成绩相同),若成绩相同则比较 age 字段(按照升序比较,return this.getAge() - o.getAge();),最后返回比较结果。通过 Collections.sort(users);对ArrayList<User> 进行排序,循环打印结果展示了按照成绩降序、年龄升序(成绩相同时)的规则排序后的用户信息。
相关文章:
List排序的方法
List 排序方法: 1. list 的 sort() package com.example.a; import java.util.ArrayList; import java.util.Comparator; import java.util.List; class User{private Integer score;private Integer age;public User(Integer score, Integer age){super();this.…...
BurstAttention:高效的分布式注意力计算框架
BurstAttention:高效的分布式注意力计算框架 在现代大型语言模型(LLMs)的应用中,提升注意力机制的计算效率已成为研究的热点。当前,提升计算效率主要有两种方法:一种是优化单设备的计算和存储能力…...
大数据治理:构建稳健的数据生态系统
引言 随着信息技术的迅猛发展,企业每天都在生成海量的数据。这些数据不仅来自传统的业务交易系统,还包括社交媒体、物联网设备、移动应用程序等多个渠道。大数据治理旨在确保组织能够有效地管理其拥有的所有数据资产,以支持决策制定、优化业…...
【图书介绍】几本适合当教材的大数据技术图书
《Spark SQL大数据分析快速上手》 《Spark SQL大数据分析快速上手(大数据技术丛书)》(迟殿委,王泽慧,黄茵茵)【摘要 书评 试读】- 京东图书 《Spark SQL大数据分析快速上手》内容基于Spark新版本展开,符合企业目前开…...
阴阳师の新手如何速刷5个SP/SSR?!(急速育成)
目标:攒5个SP/SSR式神,参与急速育成,省四个黑蛋(想要快速升级技能而且经常上场的式神在攒够5个式神前先不升级)【理论上组成:10蓝40蓝预约召唤福利20修行or抽卡】 关键点:蓝票,新手…...
unity学习4:git和SVN的使用差别
目录 1 svn 1.1 操作逻辑 1.2 对应工具 1.3 SVN避免冲突的好习惯 2 git 2.1 git的基础操作逻辑 2.1.1 commit时,提交文件之外的其他文件需要pull 2.1.2 commit时,发现要提交的本地文件和服务器的文件冲突了 2.1.3 pull 时 2.2 对应工具 2.3 …...
四大自平衡树对比:AVL树、红黑树、B树与B+树
AVL树、红黑树、B树和B树的对比与应用场景 树系列相关文章(置顶) 1、从链表到平衡树:二叉查找树的退化与优化 2、自平衡二叉查找树:如何让二叉查找树始终保持高效 3、AVL树入门:理解自平衡二叉查找树的基础 4、红黑树全…...
BUUCTF Pwn ciscn_2019_es_2 WP
1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数: 看看vul函数: 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造 所以使用栈迁移: 栈迁移需要用到leave ret 使用ROPgadget找地址: …...
MongoDb-mongosh-登录
本地登录 mongosh --username root --password xxx 参考:Connect to a Deployment - MongoDB Shell...
C语言day3:shell脚本
一、作业题3 使用数组求出当前目录下.sh文件的个数 二、作业题4 使用数组求家目录下文件的个数 三、思维导图...
微信小程序Uniapp
使用命令行创建项目(vuets) npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project然后用HBX打开项目 再安装依赖 npm i 再运行开发版本,生成dist目录 pnpm dev:mp-weixin 注意要设置APPid 再用微信小程序打开...
mongoTemplate的复杂组装条件查询
mongoTemplate不像SQL那么灵活,组装条件较为复杂。 如下演示了查询类似于 AND name ‘张三’ OR age 12 NOT birthday > 2024-12-31 这类结构的代码示例。 脑子里的范围图: 所有的AND锁定一个范围,再跟所有的OR组成的范围取并集&#…...
httpslocalhostindex 配置的nginx,一刷新就报404了
当你的Nginx配置导致页面刷新时报404错误时,通常是由于以下几个原因造成的: 静态文件路径配置错误:Nginx没有正确地指向静态文件的目录。前端路由问题:如果是SPA(单页应用),刷新页面时Nginx没有…...
pandas删除值全部为0的整行和整列,还有0.0,0.000000也要删除
在 Pandas 中,如果需要删除全部为 0 的行或列,可以通过 .all() 方法来判断行或列是否所有元素都为 0,然后删除这些行或列。 代码示例 示例数据: import pandas as pd# 示例数据 data {A: [0, 2, 0, 4],B: [0, 0, 0, 0],C: [0, …...
IO Virtualization with Virtio.part 1 [十二]
久等了各位! 本篇开始讲解 IO 虚拟化中的 virtio,我会以 Linux 的 IIC 驱动为例,从 IIC 驱动的非虚拟化实现,到 IIC 驱动的半虚拟化实现,再到最后 X-Hyper 中如何通过 virtio 来实现前后端联系,一步步把 v…...
ShardingSphere-Proxy分表场景:go测试案例
接续上篇文章《ShardingSphere-Proxy分表场景测试案例》 go测试用例: package mainimport ("fmt""math/rand""time""github.com/bwmarrin/snowflake""gorm.io/driver/mysql""gorm.io/gorm""gor…...
OpenStack系列第四篇:云平台基础功能与操作(Dashboard)
文章目录 1. 镜像(Image)添加镜像查看镜像删除镜像 2. 卷(Volume)创建卷查看卷删除卷 3. 网络(虚拟网络)创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对(…...
ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础
文章目录 简介为什么需要I2S?关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频?位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…...
25上半年软考高级系统分析师易混淆知识点
第1章 系统工程与信息系统基础 易混淆点1:系统工程生命周期与信息系统的生命周期 1、系统工程生命周期阶段 探索性研究→概念阶段→开发阶段→生产阶段→使用阶段→保障阶段→退役阶段 2、信息系统的生命周期 产生阶段→开发阶段(单个系统开发&…...
采集JSON解析错误的修复
两段采集来的JSON格式: 一: {"hwgOnlineId":"554312", "jiwuChatId":"", "phoneCategoryId":"20006", "cuxiaoSeq":{voucherTitle:1,lh 二: {"pic":&q…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时ÿ…...
mcts蒙特卡洛模拟树思想
您这个观察非常敏锐,而且在很大程度上是正确的!您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些,您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”,这个观察非…...
华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手
华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…...
