当前位置: 首页 > news >正文

list集合自定义排序

一、基本类型排序

1.list中只有数字或字符串

//升序排序 List<T> ,T为数字或字符串 
Collections.sort(list);
//降序排序
Collections.sort(list,Collections.reverseOrder());

2.list中为对象

基于jdk.18

import lombok.Data;@Data
public class User {private int id;private int age;private String name;public User(int id, int age, String name) {this.id = id;this.name = name;this.age = age;}}

2.1 使用Comparator排序 

Comparator 是类外部的比较器。使用此可构造一个可拓展的工具,无需修改原类。实现方法有两种:

2.1.1新建Compartor比较器
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class SortTest {public static void main(String[] args) {// 初始化数据List<User> list = new ArrayList<User>() {{add(new User(1, 43, "北京"));add(new User(2, 16, "天津"));add(new User(3, 33, "石家庄"));add(new User(4, 27, "深圳"));}};// 使用 Comparator 比较器排序Collections.sort(list, new UserComparator());// 打印 list 集合list.forEach(p -> {System.out.println(p);});}
}
/*** 构建User比较器*/
class UserComparator implements Comparator<User> {@Override//正数排前public int compare(User p1, User p2) {return p1.getAge() - p2.getAge();}
}

结果如下图所示:

 

 2.1.2匿名类比较器

 比较器Comparator可以使用匿名类的方式,更加简洁的实现排序,代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class SortTest {public static void main(String[] args) {// 初始化数据List<User> list = new ArrayList<User>() {{add(new User(1, 43, "北京"));add(new User(2, 16, "天津"));add(new User(3, 33, "石家庄"));add(new User(4, 27, "深圳"));}};// 使用 Comparator 的匿名内部类 比较器排序Collections.sort(list, new Comparator<User>(){@Override//倒数排前public int compare(User p1, User p2) {return p2.getAge() - p1.getAge();}});// 打印 list 集合list.forEach(p -> {System.out.println(p);});}
}

结果如下图所示 

 2.1.3 静态内部类
        //按照List中对象的id属性升序,默认升序list.sort(Comparator.comparing(User::getId));//按照List中对象的id属性降序list.sort(Comparator.comparing(User::getId).reversed());//多条件升序list.sort(Comparator.comparing(User::getId).thenComparing(User::getAge));//首先按id对对象进行排序,如果id相同,则按age进行排序list.sort(Comparator.comparing(User::getId).reversed().thenComparing(User::getAge).reversed());

2.2 使用Comparable排序

Comparable 是类内部的比较方法,需要修改比较类的内部方法,实现如下:

import lombok.Data;@Data
public class User implements Comparable<User>{private int id;private int age;private String name;public User(int id, int age, String name) {this.id = id;this.name = name;this.age = age;}@Overridepublic int compareTo(User user) {return user.getAge() - this.getAge();}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class SortTest {public static void main(String[] args) {// 初始化数据List<User> list = new ArrayList<User>() {{add(new User(1, 43, "北京"));add(new User(5, 16, "天津"));add(new User(3, 33, "石家庄"));add(new User(4, 27, "深圳"));}};// 使用Comparable进行排序Collections.sort(list);list.forEach(p -> {System.out.println(p);});}
}

 结果如下图所示:

3.使用Stream流排序

3.1 stream的升序降序

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;public class SortTest {public static void main(String[] args) {// 初始化数据List<User> list = new ArrayList<User>() {{add(new User(1, 43, "北京"));add(new User(5, 16, "天津"));add(new User(3, 33, "石家庄"));add(new User(4, 27, "深圳"));}};// 使用Stream排序,默认升序,使用reversed为降序list = list.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());list.forEach(p -> System.out.println(p));}
}

3.2 stream中的组合排序

        // 使用Stream排序的组合排序,使用age降序,再使用id升序list = list.stream().sorted(Comparator.comparing(User::getAge).reversed().thenComparing(User::getId)).collect(Collectors.toList());

 

3.3 stream中null的处理

若类中有null的情况,可用nullsFirst或nullsLast等方法进行处理(将User类中的int类型修改为了Integer,int类型不允许为null,默认为0),代码示例如下

import lombok.Data;@Data
public class User{private Integer id;private Integer age;private String name;public User(Integer id, Integer age, String name) {this.id = id;this.name = name;this.age = age;}
}
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;public class SortTest {public static void main(String[] args) {// 初始化数据List<User> list = new ArrayList<User>() {{add(new User(1, 43, "北京"));add(new User(5, 16, "天津"));add(new User(3, 33, "石家庄"));add(new User(4, null, "深圳"));}};// 使用Stream排序,默认升序,使用reversed为降序,nullsXXX处理null的情况list = list.stream().sorted(Comparator.comparing(User::getAge,Comparator.nullsFirst(Integer::compareTo))).collect(Collectors.toList());list.forEach(p -> System.out.println(p));}
}

结果如下所示:

相关文章:

list集合自定义排序

一、基本类型排序 1.list中只有数字或字符串 //升序排序 List<T> ,T为数字或字符串 Collections.sort(list); //降序排序 Collections.sort(list,Collections.reverseOrder());2.list中为对象 基于jdk.18 import lombok.Data;Data public class User {private int i…...

PHP Cookies:应用与管理

在Web开发中&#xff0c;Cookies是一种在客户端&#xff08;通常是浏览器&#xff09;存储少量数据的机制。PHP作为一种服务器端脚本语言&#xff0c;提供了对Cookies的全面支持&#xff0c;使得开发者可以轻松地设置、读取和删除Cookies。Cookies通常用于存储用户的会话信息&a…...

【GD32F303红枫派使用手册】第十四节 DAC-输出电压实验

14.1 实验内容 通过本实验主要学习以下内容&#xff1a; DAC工作原理 使用DAC输出电压 14.2 实验原理 14.2.1 DAC工作原理 我们上几章学习了ADC&#xff0c;本章我们来学习DAC。ADC是模-数转换&#xff0c;即模拟量转换为数字量&#xff0c;DAC正好相反&#xff0c;即数-…...

java 使用Log4j进行日志记录

要在Java项目中使用Log4j进行日志记录&#xff0c;需要经过以下步骤&#xff1a; 添加Log4j依赖&#xff1a;在项目的pom.xml文件中&#xff0c;添加Log4j依赖。例如&#xff1a; <dependency><groupId>log4j</groupId><artifactId>log4j</artifa…...

【问题解决】adb remount 失败或刷机无法连接设备(KaiOS)

问题描述 1、设备无法adb remount成功&#xff0c; 2、通过fastboot无法识别设备&#xff0c;一直卡住 3、已经识别到9008端口&#xff0c;但是设备与刷机工具connect fail&#xff0c;甚至软件crash 解决方案 1、安装高通驱动工具&#xff1a;QDLoder HS-USB Driver QDLoade…...

为什么电容两端电压不能突变

我们先从RC延时电路说起吧&#xff0c;图1是最简单的RC延时电路&#xff0c;给一个阶跃的电压信号&#xff0c;电压会变成黄色曲线这个样子&#xff0c;这是为什么呢&#xff1f; 图1 电压跳变后&#xff0c;电源负极电子移动到电容下极板&#xff0c;排斥上极板电子流动到电源…...

Redux 与 MVI:Android 应用的对比

Redux 与 MVI&#xff1a;Android 应用的对比 在为 Android 应用选择合适的状态管理架构时可能会感到困惑。在这个领域中&#xff0c;有两种流行的选择是 Redux 和 MVI&#xff08;Model-View-Intent&#xff09;。两者都有各自的优缺点&#xff0c;因此在深入研究之前了解它们…...

《MySQL是怎样运行的》读书笔记(三) B+树索引

前言 从前面数据存储结构中我们已经知道了页和记录的关系示意图: 其中页a、页b、页c ... 页n 这些页可以不在物理结构上相连&#xff0c;只要通过双向链表相关联即可。 在正式介绍索引之前&#xff0c;我们需要了解一下没有索引的时候是怎么查找记录的。下边先只讨论搜索条件…...

微信小程序基础工作模板

1.轮播图 点击跳转官方文档 简单例子 <!-- 顶部轮播图 --> <swiper indicator-dots"true" class"banner" autoplay"true" interval"2000"><swiper-item><image src"../../images/轮播图1.jpg" >…...

简单说一下STL中的map容器的特点、底层实现和应用场景【面试】

特点&#xff1a; 基于红黑树&#xff1a;std::map利用红黑树的自平衡特性&#xff0c;确保操作的平衡性。有序容器&#xff1a;元素根据键的顺序自动排序&#xff0c;排序依据是预定义的键比较函数。唯一键值&#xff1a;容器保证每个键的唯一性&#xff0c;不允许重复键存在…...

Ubuntu22.04之有道词典无法画词翻译替代方案(二百四十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

AnythingLLM 的 Docker 使用

AnythingLLM是使用大语言模型LLM的一站式简便框架。官网的介绍如下&#xff1a; AnythingLLM is the easiest to use, all-in-one AI application that can do RAG, AI Agents, and much more with no code or infrastructure headaches. 1. 使用官方docker 最方便的方法是使…...

数组还可以这样用!常用但不为人知的应用场景

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…...

C++模板元编程:编译时的魔法

1. 引言 在C的世界中&#xff0c;模板元编程是一种在编译时执行计算的强大技术。它允许开发者编写高度灵活和高效的代码&#xff0c;这些代码可以在不牺牲性能的前提下&#xff0c;根据类型和值的不同而变化。本文将深入探讨模板元编程的奥秘&#xff0c;并展示如何在现代C开发…...

SQL进阶day10————多表查询

目录 1嵌套子查询 1.1月均完成试卷数不小于3的用户爱作答的类别 1.2月均完成试卷数不小于3的用户爱作答的类别 ​编辑1.3 作答试卷得分大于过80的人的用户等级分布 2合并查询 2.1每个题目和每份试卷被作答的人数和次数 2.2分别满足两个活动的人 3连接查询 3.1满足条件…...

debug调试_以Pycharm为例

文章目录 作用步骤打断点调试调试窗口 作用 主要是检查逻辑错误&#xff0c;而非语法错误。 步骤 打断点 在需要调试的代码行前打断点&#xff0c;执行后会停顿在断点位置&#xff08;不运行&#xff09; 调试 右键“debug”&#xff0c;或者直接点击右上角的小虫子 调试…...

wms第三方海外仓系统:如何为中小型海外仓注入新活力

对于中小型海外仓来说&#xff0c;想在大型集团海外仓同台竞争中获得优胜&#xff0c;提升其管理效率是非常关键的一环。 我们所熟知的wms系统&#xff0c;也就是第三方成熟海外仓系统&#xff0c;正是这些海外仓企业提升管理水平、降低成本的重要工具。 1、wms第三方海外仓系…...

html是什么?http是什么?

html Html是什么&#xff1f;http是什么&#xff1f; Html 超文本标记语言&#xff1b;负责网页的架构&#xff1b; http(&#xff08;HyperText Transfer Protocol&#xff09;超文本传输协议&#xff1b; https&#xff08;全称&#xff1a;Hypertext Transfer Protocol …...

L1-007 念数字js实现

异步解法 const readline require("readline"); const rl readline.createInterface({input: process.stdin,output: process.stdout, }); const input_arr [];//储存数据 rl.on(line, function (line) {input_arr.push(line); } ); rl.on(close, function () {/…...

Perl 运算符

Perl 运算符 Perl 是一种功能强大的编程语言&#xff0c;广泛应用于系统管理、网络编程、GUI 创建、数据库访问等众多领域。Perl 的语法灵活&#xff0c;支持多种编程范式&#xff0c;包括过程式、面向对象和函数式编程。在 Perl 中&#xff0c;运算符扮演着重要的角色&#x…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...