JAVA 排序用法

news/2025/10/23 20:49:06/文章来源:https://www.cnblogs.com/aibi1/p/19161610

目录
  • 背景和价值
      • 一、 Comparator 的基本用法
      • 二、 Java 8 之前(匿名内部类)
      • 三、 Java 8 之后(Lambda 表达式和方法引用)
        • 1. 使用 Lambda 表达式
        • 2. 使用静态工厂方法 Comparator.comparing()(推荐)
        • 3. 链式比较(多条件排序)
        • 4. 处理 null
      • 总结要点
  • 参考资料

背景和价值

Java 中的比较器(Comparator)是函数式编程中非常重要的一部分,它主要用于自定义排序规则。在 Java 8 之后,结合 Lambda 表达式和 Stream API,它的用法变得更加简洁和强大。

Java 提供了两种主要的比较机制:

  1. Comparable 接口: 用于对象自身的默认排序(自然排序)。
  2. Comparator 接口: 用于定义外部的自定义排序规则。

一、 Comparator 的基本用法

Comparator<T> 是一个函数式接口,只有一个抽象方法:

public interface Comparator<T> {int compare(T o1, T o2); // 核心方法// ... default 和 static 方法
}
  • 如果 compare(o1, o2) 返回 负数,表示 o1 排在 o2 前面
  • 如果 compare(o1, o2) 返回 ,表示 o1o2 相等
  • 如果 compare(o1, o2) 返回 正数,表示 o1 排在 o2 后面

二、 Java 8 之前(匿名内部类)

在 Java 8 之前,你需要使用匿名内部类来实现 Comparator

List<Student> students = new ArrayList<>();
// ... 填充数据// 按分数升序排序
Collections.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {return s1.getScore() - s2.getScore();// 或使用包装类的方法:Integer.compare(s1.getScore(), s2.getScore());}
});

三、 Java 8 之后(Lambda 表达式和方法引用)

Java 8 极大地简化了 Comparator 的使用。

1. 使用 Lambda 表达式

由于 Comparator 是一个函数式接口,可以直接用 Lambda 表达式实现 compare 方法:

// 按分数升序排序
Collections.sort(students, (s1, s2) -> s1.getScore() - s2.getScore());// 在 Stream 中使用 (分数降序排序)
students.stream().sorted((s1, s2) -> s2.getScore() - s1.getScore()) // s2 减 s1 实现降序.forEach(System.out::println);

2. 使用静态工厂方法 Comparator.comparing()(推荐)

这是最推荐的方式,它允许你使用方法引用来指定排序的键(key):

  • 按分数升序:
    students.stream().sorted(Comparator.comparing(Student::getScore)) // 默认升序.forEach(System.out::println);
    
  • 按分数降序:
    students.stream().sorted(Comparator.comparing(Student::getScore).reversed()) // .reversed() 翻转顺序.forEach(System.out::println);
    
  • 按字符串(例如:姓名)升序:
    students.stream().sorted(Comparator.comparing(Student::getName)).forEach(System.out::println);
    

3. 链式比较(多条件排序)

你可以使用 thenComparing() 来指定第二个、第三个等排序规则,这在第一个字段相同时非常有用。

示例:先按专业升序,如果专业相同,则按分数降序。

students.stream().sorted(Comparator.comparing(Student::getMajor) // 1. 主要排序:按专业升序.thenComparing(Comparator.comparing(Student::getScore).reversed()) // 2. 次要排序:按分数降序).forEach(System.out::println);

4. 处理 null

如果排序字段可能为 null,可以使用 nullsFirst()nullsLast() 来指定 null 值的排序位置。

示例:按姓名排序,null 姓名排在最后。

students.stream().sorted(Comparator.comparing(Student::getName, Comparator.nullsLast(String::compareTo))).forEach(System.out::println);

总结要点

用法 描述 示例
基础升序 使用 comparing() 传入 Getter 方法引用。 Comparator.comparing(Student::getScore)
基础降序 在基础升序后调用 reversed() Comparator.comparing(Student::getScore).reversed()
多条件排序 使用 thenComparing() 链接多个比较器。 comparing(...).thenComparing(...)
原始类型 comparingInt(), comparingLong(), comparingDouble() 效率更高。 Comparator.comparingInt(Student::getScore)
处理 Null 使用 nullsFirst()nullsLast() 包裹。 Comparator.nullsFirst(Comparator.comparing(Student::getName))

参考资料

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

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

相关文章

esp32-usb-jtag 调试踩坑

背景 ESP 芯片通常使用 UART 实现串口,并可以通过外部 USB-UART 桥接芯片,连接到主机/PC 上的串口控制台仿真器。然而,在具有 USB 串行/JTAG 控制器的 ESP 芯片上,控制器的 CDC-ACM 部分即可实现串口,该串口直接连…

MySQLDay3

3.约束 3.1、概述概念:约束时作用于表中字段上的规则,用于限制存储在表中的数据。目的:保证数据库中数据的正确、有效性和完整性。分类:注意:约束时作用于表中字段上的,可以在创建表/修改表的时候添加约束。 案例…

第3天(中等题+简单题 数组、滑动窗口)

打卡第三天 1道简单题+2道中等题定长滑动窗口套路:今日耗时≈一小时 明天继续

飞牛OS通过docker部署SillyTavern酒馆

一、下载在飞牛 Docker -> 镜像仓库 中搜索 SillyTavern 下载镜像。镜像仓库中没有官方的 SillyTavern 镜像,下载有最多下载数的镜像即可,我使用 goolashe/sillytavern:stable 。前往 GitHub - SillyTavern/Silly…

完整教程:微信小程序学习(一)

完整教程:微信小程序学习(一)2025-10-23 20:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !import…

ollama v0.12.2 版本更新详解:Qwen3 架构协助、Multi-Regex 分词器、新引擎前后缀匹配等功能升级

ollama v0.12.2 版本更新详解:Qwen3 架构协助、Multi-Regex 分词器、新引擎前后缀匹配等功能升级pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

深入解析:XML中的 CDATA mybaitis xml中的 <![CDATA[ xxxx ]]>

深入解析:XML中的 CDATA mybaitis xml中的 <![CDATA[ xxxx ]]>pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

MySQL主从同步读写分离

[!NOTE] 准备三台机器: 两台用于主从同步,一台读写分离。 环境初始化:关防火墙一、主从同步实验主机从机安装数据库 # 安装 wget下载工具yum -y install wget # 下载 mysql 官方 yum 源安装包wget https://repo.mys…

AI股票预测分析报告 - 2025年10月23日 20:26

AI股票预测分析报告 - 2025年10月23日 20:26body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-wi…

nginx反向代理测试搭建

一、nginx反向代理模拟搭建[!IMPORTANT] 步骤: 1.准备三台服务器,一台装nginx,配置两个网卡,一个有网一个无网;两台装jdk和tomecat,无网(仅主机模式) 2.两台被访问的服务器,进入tomcat中的webapps中,删除所有文…

SwiftUI NavigatorStack 导航容器

NavigationStack 是一个用状态驱动、类型安全的声明式导航容器,它通过管理视图堆栈和导航路径来实现 SwiftUI 应用中的页面导航(专注于单栏场景) NavigationStack 需要 iOS 16.0+以上版本支持。 核心要素 Navigatio…

深入解析:【仿生机器人】基于 GPT-SoVITS 的 发声器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

.NET Core报错克服【无废话上操作】

.NET Core报错克服【无废话上操作】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

深入解析:【算法】【数学】 练习题目列表

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

题解:P11831 [省选联考 2025] 追忆

\(\LARGE {P11831 [省选联考 2025] 追忆}\) 题解原出处 请阅读完彼题解再阅读此题解,此题解不对解题思路分析有帮助 仅仅提供代码上的解惑 我只是对他的代码进行了非常详细的注释处理,orz大佬题意: 大哥图,考虑的是…

2025-10-23 MX-S 模拟赛 赛后总结【MX】

赛时 Record14:30 为何 T1 串串。 14:45 摸了字符串哈希。这真的是大洋里吗,为何这么水。 14:58 诶我草原来 T2 的 \(t_i\le 3\) 吗。 15:22 试图推 T2 神秘 dp 式。 16:00 被击败了。 16:09 写出来了,最后发现是忘了…

PCL1.12 解决memory.h中EIGEN处中断问题

PCL1.12 解决memory.h中EIGEN处中断问题在使用PCL1.12时,出现已在 VisionFormatWork.exe 中执行断点指令(__debugbreak () 语句或类似调用) 的提示。 __debugbreak() 是一个由编译器提供的 调试断点指令(类似汇编中…

深入解析:链表的核心思想

深入解析:链表的核心思想pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

AI元人文构想:参与“自由与责任”哲学思考——岐金兰之实验

AI元人文构想:参与“自由与责任”哲学思考——岐金兰之实验 让我们以“AI元人文”构想为透镜,重新审视“自由与责任”这一古老的哲学谜题。这将不再是一场纯粹的思辨,而是一次为智能行为构建底层架构的思想实验。 基…

20251023

总结 A 预计:100,实际:60 用时:10min思路历程:居然看错题了,以为可以整个一段全部是一个字母,关键是样例刚好全部能过 正解:666 收获:最好多看几遍题和数据范围B 预计:100,实际:100 用时:30min思路历程:…