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

关于Java集合中对象字段的不同排序实现方式

📊 关于Java集合中对象字段的不同排序实现方式

#Java集合 #排序算法 #Comparator #性能优化


一、排序基础:两种核心方式对比

方式Comparable接口Comparator接口
实现位置目标类内部实现独立类或匿名内部类
排序逻辑自然排序(固定规则)自定义排序(灵活多变)
使用场景单一默认排序规则多条件动态排序
方法compareTo(T o)compare(T o1, T o2)

二、单字段排序实战

2.1 使用Comparable接口(自然排序)

public class Student implements Comparable<Student> {private String name;private int age;private double score;// 构造方法、getter/setter省略@Overridepublic int compareTo(Student other) {// 按年龄升序return Integer.compare(this.age, other.age);}
}// 使用
List<Student> students = new ArrayList<>();
Collections.sort(students); // 自动使用compareTo

2.2 使用Comparator(灵活排序)

// 按分数降序
students.sort((s1, s2) -> Double.compare(s2.getScore(), s1.getScore()));// 方法引用简化版
Comparator<Student> scoreComparator = Comparator.comparingDouble(Student::getScore).reversed();
students.sort(scoreComparator);

三、多字段组合排序

3.1 多级排序(优先级顺序)

// 先按年龄升序,年龄相同按分数降序
Comparator<Student> complexComparator = Comparator.comparingInt(Student::getAge).thenComparing(Student::getScore, Comparator.reverseOrder());students.sort(complexComparator);

3.2 空值安全处理

// 处理可能为null的字段(如name)
Comparator.nullsFirst(Comparator.naturalOrder());Comparator<Student> nullSafeComparator = Comparator.comparing(Student::getName, Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER)).thenComparingInt(Student::getAge);

四、高级排序技巧

4.1 自定义排序逻辑

// 按成绩等级排序:优秀(>=90) > 良好(>=80) > 及格(>=60) > 不及格
Comparator<Student> gradeComparator = (s1, s2) -> {int grade1 = getGradeLevel(s1.getScore());int grade2 = getGradeLevel(s2.getScore());return Integer.compare(grade1, grade2);
};private int getGradeLevel(double score) {if (score >= 90) return 0;if (score >= 80) return 1;if (score >= 60) return 2;return 3;
}

4.2 中文拼音排序

Comparator<Student> chineseComparator = Comparator.comparing(s -> Collator.getInstance(Locale.CHINA).getCollationKey(s.getName()));

4.3 使用Stream API排序

// 生成新排序集合(原集合不变)
List<Student> sortedStudents = students.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());// 并行流优化(大数据量)
List<Student> parallelSorted = students.parallelStream().sorted(complexComparator).collect(Collectors.toList());

五、性能优化与注意事项

  1. 时间复杂度

    • Collections.sort()使用改进的归并排序(平均O(n log n))
    • 避免在循环内部重复创建Comparator对象
  2. 对象不可变性

    // 正确做法:返回新集合
    List<Student> immutableSorted = students.stream().sorted(myComparator).toList(); // Java 16+// 错误做法:修改原始集合
    students.sort(myComparator); // 直接修改原集合
    
  3. 对象相等性

    • 重写equals()时必须与compareTo()保持一致
    • 推荐同时实现Comparable和equals/hashCode

六、常见问题解决方案

问题1:排序后顺序不符合预期

  • 检查字段类型:数值类型不要用字符串比较
  • 验证Comparator逻辑:使用单元测试验证比较结果

问题2:Java 8+排序特性失效

// 旧版兼容写法
Collections.sort(students, Comparator.comparing(Student::getDepartment).thenComparing(Student::getId));

问题3:大对象集合内存溢出

  • 使用外部排序(归并排序+文件存储)
  • 分页排序:结合数据库LIMIT/OFFSET

七、最佳实践总结

  1. 选择策略

    • 单一自然排序 → Comparable
    • 灵活多条件 → Comparator
  2. 代码规范

    // Good:清晰的方法引用
    Comparator.comparing(Person::getBirthDate)// Bad:冗长的Lambda
    Comparator.comparing(p -> p.getBirthDate())
    
  3. 工具推荐

    • IntelliJ IDEA:自动生成Comparator代码

    • Google GuavaComparisonChain链式比较

      public int compareTo(Student other) {return ComparisonChain.start().compare(this.age, other.age).compare(other.score, this.score) // 降序.result();
      }
      

示例数据集测试

List<Student> testData = Arrays.asList(new Student("王五", 20, 88.5),new Student("张三", 22, 92.0),new Student("李四", 20, 75.5),new Student(null, 25, 81.0)
);testData.sort(nullSafeComparator);
// 结果:
// [null, 李四(20,75.5), 王五(20,88.5), 张三(22,92.0)]

通过合理运用这些技巧,您可以在Java中优雅高效地处理各种对象字段排序需求! 🚀

相关文章:

关于Java集合中对象字段的不同排序实现方式

&#x1f4ca; 关于Java集合中对象字段的不同排序实现方式 #Java集合 #排序算法 #Comparator #性能优化 一、排序基础&#xff1a;两种核心方式对比 方式Comparable接口Comparator接口实现位置目标类内部实现独立类或匿名内部类排序逻辑自然排序&#xff08;固定规则&#xf…...

ZKmall开源商城静态资源管理:Nginx 配置与优化

ZKmall开源商城作为电商平台&#xff0c;其商品图片、前端资源等静态内容的高效管理与分发直接影响用户体验和系统性能。基于Nginx的静态资源管理方案&#xff0c;结合动静分离、缓存优化、安全加固、性能调优四大核心策略&#xff0c;可显著提升平台响应速度与稳定性。以下是具…...

Google Gemini 系列AI模型 的详细解析,涵盖其技术特点、版本差异、应用场景及优势

以下是 Google Gemini 系列AI模型 的详细解析&#xff0c;涵盖其技术特点、版本差异、应用场景及优势&#xff1a; 1. Gemini 系列概述 发布背景&#xff1a; Google于2023年推出 Gemini 系列模型&#xff0c;作为其多模态大模型的里程碑&#xff0c;旨在结合文本、图像、音频…...

量子通信应用:量子安全物联网(三)协议融合

第一部分:引言与概述 1.1 量子安全物联网的背景与必要性 随着物联网(IoT)设备的爆炸式增长(预计2030年全球连接设备超750亿台),传统安全机制(如RSA、ECC加密)正面临量子计算的颠覆性威胁。量子计算机的Shor算法可在多项式时间内破解非对称加密体系,而Grover算法则对…...

鸿蒙API15 “一多开发”适配:解锁黄金三角法则,开启高效开发新旅程

一、引言 在万物互联的时代浪潮中&#xff0c;鸿蒙操作系统以其独特的 “一多开发” 理念&#xff0c;为开发者打开了一扇通往全场景应用开发的新大门。“一多开发”&#xff0c;即一次开发&#xff0c;多端部署 &#xff0c;旨在让开发者通过一套代码工程&#xff0c;就能高效…...

量子计算:开启未来科技之门的钥匙

在当今科技飞速发展的时代&#xff0c;量子计算正逐渐从实验室走向实际应用&#xff0c;成为全球科技领域的焦点之一。它有望为众多行业带来前所未有的变革&#xff0c;从密码学、药物研发到金融风险评估等&#xff0c;量子计算的潜力不可限量。 一、量子计算的原理 量子计算基…...

k230学习笔记-疑难点(1)

1.出现boot failed with exit code 19: 需要将k230开发板的btoot0拨到ON 2.出现boot failed with exit code 13: 说明k230开发板的固件烧录已经丢失&#xff0c;需要重新烧录 *** 注意重新烧录时需要将btoot0重新拨到OFF&#xff0c;才会弹出加载固件需要的通用串行总线&…...

驱动-自旋锁

前面原子操作进行了讲解&#xff0c; 并使用原子整形操作对并发与竞争实验进行了改进&#xff0c;但是原子操作只能对整形变量或者位进行保护&#xff0c; 而对于结构体或者其他类型的共享资源&#xff0c; 原子操作就力不从心了&#xff0c; 这时候就轮到自旋锁的出场了。 两个…...

10.(vue3.x+vite)div实现tooltip功能(css实现)

1:效果截图 2:代码实现 <template><div><div class="tooltip" style="margin-top: 20%; margin-left: 20%; background-color: blueviolet; color: white;...

使WebSocket 稳定可靠,需要考虑的方向

文章目录 1. 连接管理2. 心跳检测3. 重连机制4. 消息队列5. 错误处理6. 资源管理7. 安全性8. 状态同步 示例代码1. 添加依赖2. WebSocket 客户端实现代码注释功能标注3. 安卓端使用MainActivity.java布局文件&#xff08;activity_main.xml&#xff09; 4. 后端&#xff08;Fla…...

Linux:进程:进程调度

进程在CPU上运行具有以下特性&#xff1a; 竞争、独⽴、并⾏、并发 竞争性:系统进程数⽬众多&#xff0c;⽽CPU资源很少甚至只有一个&#xff0c;所以进程之间是具有竞争属性的。为 了⾼效完成任务&#xff0c;更合理竞争相关资源&#xff0c;便具有了优先级 独⽴性: 为了避…...

Stable Diffusion 图像生成 GUI 应用:图像缩放等五个优化——SD界面学习记录

本篇续前面Stable DiffusionPyqt5实现图像生成和管理界面&#xff0c;链接如下&#xff1a; Stable DiffusionPyqt5&#xff1a; 实现图像生成与管理界面&#xff08;带保存 历史记录 删除功能&#xff09;——我的实验记录&#xff08;结尾附系统效果图&#xff09;-CSDN博客…...

职坐标解码互联网行业转型发展新动能

当前&#xff0c;互联网行业正以前所未有的速度重塑全球产业格局。工信部最新数据显示&#xff0c;我国互联网企业营收连续三年保持双位数增长&#xff0c;其中百强企业在人工智能、物联网等领域的投入强度同比提升40%&#xff0c;展现出强劲的技术引领力。与此同时&#xff0c…...

【含文档+PPT+源码】基于微信小程序的非遗文化黄梅戏宣传平台的设计与实现

课程目标&#xff1a; 教你从零开始部署运行项目&#xff0c;学习环境搭建、项目导入及部署&#xff0c;含项目源码、文档、数据库、软件等资料 课程简介&#xff1a; 本课程演示的是一款基于微信小程序的非遗文化黄梅戏宣传平台的设计与实现&#xff0c;主要针对计算机相关…...

Causal Attention的底层原理

Causal Attention Transformer的Decoder中最显著的结构是Casual Attention。 通过本篇文章&#xff0c;你将学会 Casual Attention的机制原理 Casual Attention在TensorFlow中的实现原理 如何快速地保存并打印TensorFlow中模型已经训练好的参数 如何实现Transformer的Dec…...

深入理解类:ArkTS面向对象编程的核心概念

# 深入理解类&#xff1a;ArkTS面向对象编程的核心概念 在编程世界里&#xff0c;面向对象编程&#xff08;OOP&#xff09;是一种强大的编程范式&#xff0c;而类则是OOP的核心构建块。在ArkTS语言中&#xff0c;类的设计和使用对于构建复杂、可维护的应用程序至关重要。今天…...

AI 驱动下的后端开发架构革命:从智能协同体系

AI 驱动下的后端开发架构革命&#xff1a;从智能协同体系 一、引言&#xff1a;AI 重构后端开发范式 在 2025 年的企业级技术演进中&#xff0c;人工智能正从辅助工具升级为核心架构要素。根据 Gartner《2025 智能技术栈成熟度报告》&#xff0c;传统 "人力编码 硬规则…...

vue3 Ts axios 封装

vue3 Ts axios 封装 axios的封装 import axios, { AxiosError, AxiosInstance, InternalAxiosRequestConfig, AxiosResponse, AxiosRequestConfig, AxiosHeaders } from axios import qs from qs import { config } from ./config import { ElMessage } from element-plus// …...

CyberAgentAILab 开源数字人项目TANGO,heygen的开源版来了~

简介 TANGO 是 CyberAgentAILab 开源的一项前沿研究成果&#xff0c;其初衷在于探索高效生成模型在实际应用场景中的表现。项目诞生于 CyberAgent 在整合创意与人工智能的实践中&#xff0c;旨在为数字内容生成、交互和实时渲染等领域提供一个高性能、模块化、可扩展的解决方案…...

ROS ROS2 机器人深度相机激光雷达多传感器标定工具箱入门教程(一)

系列文章目录 目录 系列文章目录 前言 一、安装 1.1 ROS 2 官方软件包 二、教程 2.1 标定配置器 2.1.1 机器人选项 2.1.2.1 外参相机-激光雷达标定 2.1.2.2 外参激光雷达-激光雷达标定 2.1.2.3 外参相机参照标定 2.1.2.4 外参激光雷达-参考标定 2.2 外参照相机-激…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(6):ながら 一边。。一边

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;6&#xff09;&#xff1a;ながら 一边。。一边 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰 2、知识点&#xff08;1&#xff09;ながら1&#xff09;一边。。一边2&#xff0…...

从EOF到REOF:如何用旋转经验正交函数提升时空数据分析精度?

目录 1. 基本概念与原理2. 应用场景3. 与传统EOF的区别4. 技术实现5. 其他领域中的“REOF”参考资料 REOF 的输入是多个地区在不同时间的气候数据&#xff08;如温度或降雨量&#xff09;&#xff0c;它的作用是通过旋转计算找出这些数据中最主要的变化规律&#xff0c;输出则是…...

【HDFS入门】HDFS与Hadoop生态的深度集成:与YARN、MapReduce和Hive的协同工作原理

目录 引言 1 HDFS核心架构回顾 2 HDFS与YARN的集成 3 HDFS与MapReduce的协同 4 HDFS与Hive的集成 4.1 Hive架构与HDFS交互 4.2 Hive数据组织 4.3 Hive查询执行流程 5 HDFS在生态系统中的核心作用 6 性能优化实践 7 总结 引言 在大数据领域&#xff0c;Hadoop生态系统…...

用 AI 十天开发小程序:探秘 “幸运塔塔屋” 之 “解惑指南书” 功能

在当今软件开发领域&#xff0c;AI 技术正以前所未有的速度改变着我们的开发方式。我仅用十天时间&#xff0c;借助 AI 成功开发出 “幸运塔塔屋” 小程序&#xff0c;其中 “解惑指南书” 功能别具一格。今天&#xff0c;就为大家详细剖析这个功能从构思到落地的全过程。 十天…...

直流电源基本原理

整流电路 在构建整流电路时&#xff0c;要选择合适参数的二极管 If是二极管能够通过电流的能力&#xff0c;也是最大整流的平均电流。 还要考虑二极管的反向截至电压。 脉动系数电压交流幅值/直流平均电压&#xff08;越小越好&#xff09; 三相整流电路优点&#xff1a; …...

osu ai 论文笔记 DQN

e https://theses.liacs.nl/pdf/2019-2020-SteeJvander.pdf Creating an AI for the Rhytm Game osu! 20年的论文 用监督学习训练移动模型100首歌能达到95准确率 点击模型用DQN两千首歌65准确率 V抖用的居然不是强化学习&#xff1f; 5,6星打96准确度还是有的东西的 这是5.…...

MapReduce实验:分析和编写WordCount程序(对文本进行查重)

实验环境&#xff1a;已经部署好的Hadoop环境 Hadoop安装、配置与管理_centos hadoop安装-CSDN博客 实验目的&#xff1a;对输入文件统计单词频率 实验过程&#xff1a; 1、准备文件 test.txt文件&#xff0c;它是你需要准备的原始数据文件&#xff0c;存放在你的 Linux 系…...

Windows Acrobat Pro DC-v2025.001.20435-x64-CN-Portable便携版

Windows Acrobat Pro 链接&#xff1a;https://pan.xunlei.com/s/VOO1nMjQ1Qf53dyISGne0c_9A1?pwdsfgn# Acrobat Pro 2024 专业增强版特色 ● 创建和编辑 PDF 文件&#xff1a;可以将各种类型的文档转换为 PDF 格式&#xff0c;并进行编辑和修改。 ● 合并和拆分 PDF&#…...

二十、FTP云盘

1、服务端 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h>…...

【4】k8s集群管理系列--harbor镜像仓库本地化搭建

一、harbor基本概念 ‌Harbor是一个由VMware开源的企业级Docker镜像仓库解决方案‌&#xff0c;旨在解决企业在容器化应用部署中的痛点&#xff0c;提供镜像存储、管理、安全和分发的全生命周期管理‌。Harbor扩展了Docker Registry&#xff0c;增加了企业级功能&#xff0c;如…...