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

news2025/4/19 15:57:08

📊 关于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省略

    @Override
    public 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中优雅高效地处理各种对象字段排序需求! 🚀

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

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

相关文章

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; 原子操作就力不从心了&#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;

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…

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 外参照相机-激…

【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&#…

Oracle 12.1.0.2补丁安装全流程

第一步&#xff0c;先进行备份 tar -cvf u01.tar /u01 第二步&#xff0c;更新OPatch工具包 根据补丁包中readme信息汇总提示的信息&#xff0c;下载对应版本的OPatch工具包&#xff0c;本次下载的版本为&#xff1a; p6880880_122010_Linux-x86-64.zip opatch版本为最新的…