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

Java中排序规则详解

一、排序基础概念

在Java中,排序的核心是比较规则的实现。Java提供了两种主要机制来定义排序规则:

  • 自然排序:通过 Comparable 接口实现

  • 定制排序:通过 Comparator 接口实现

1.1 自然排序 (Comparable)

实现原理:对象自身实现 Comparable 接口,定义与其他同类对象的自然顺序

public interface Comparable<T> {int compareTo(T o);
}

返回值规则

  • 负数:当前对象 < 比较对象

  • :当前对象 = 比较对象

  • 正数:当前对象 > 比较对象

示例:自定义Person类实现自然排序

class Person implements Comparable<Person> {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Person other) {// 先按年龄排序,再按姓名排序int ageCompare = Integer.compare(this.age, other.age);return ageCompare != 0 ? ageCompare : this.name.compareTo(other.name);}
}

使用条件

  • 当对象有"自然顺序"时(如数字大小、字符串字典序)

  • 需要作为TreeSet/TreeMap的键值

  • 需要默认排序行为时

1.2 定制排序 (Comparator)

实现原理:创建独立比较器,为没有实现Comparable的类或需要不同排序规则时提供灵活性

public interface Comparator<T> {int compare(T o1, T o2);
}

示例:创建不同的比较器

// 按姓名排序的比较器
Comparator<Person> nameComparator = (p1, p2) -> p1.getName().compareTo(p2.getName());// 按年龄倒序排序的比较器
Comparator<Person> ageDescComparator = (p1, p2) -> Integer.compare(p2.getAge(), p1.getAge());

使用条件

  • 需要多种排序规则

  • 无法修改类源码(如第三方库类)

  • 需要临时排序规则

  • 需要特殊排序(如倒序、多字段组合)

二、数组排序方法

2.1 Arrays.sort() 基本用法

// 基本类型数组(自然排序)
int[] numbers = {5, 2, 9, 1};
Arrays.sort(numbers); // [1, 2, 5, 9]// 对象数组(需要实现Comparable)
Person[] people = {...};
Arrays.sort(people);

2.2 使用Comparator定制数组排序

// 按姓名排序
Arrays.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName()));// 按年龄倒序
Arrays.sort(people, (p1, p2) -> p2.getAge() - p1.getAge());

三、集合排序方法

3.1 Collections.sort()

List<Integer> numbers = Arrays.asList(5, 2, 9, 1);
Collections.sort(numbers); // 自然排序List<Person> people = new ArrayList<>();
Collections.sort(people, Comparator.comparing(Person::getName)); // 定制排序

3.3 SortedSet/TreeSet 自动排序

// 自动按自然顺序排序
Set<Integer> sortedNumbers = new TreeSet<>(Arrays.asList(5, 2, 9, 1));// 使用Comparator定制排序
Set<Person> sortedPeople = new TreeSet<>(Comparator.comparing(Person::getAge).reversed()
);

四、Java 8+ 高级排序技术

4.1 Comparator 工厂方法

Java 8为Comparator接口提供了丰富的静态工厂方法:

方法描述示例
comparing()按属性提取键Comparator.comparing(Person::getName)
comparingInt()提取int属性Comparator.comparingInt(Person::getAge)
thenComparing()次级排序comparing(Person::getAge).thenComparing(Person::getName)
reversed()反转顺序comparing(Person::getAge).reversed()
naturalOrder()自然顺序Comparator.naturalOrder()
nullsFirst()null排最前Comparator.nullsFirst(comparing(Person::getName))
nullsLast()null排最后Comparator.nullsLast(comparing(Person::getName))

组合排序示例

List<Person> sorted = people.stream().sorted(Comparator.comparing(Person::getDepartment).thenComparingInt(Person::getAge).thenComparing(Person::getName, String.CASE_INSENSITIVE_ORDER)).toList();

4.2 方法引用简化

// 传统Lambda
people.sort((p1, p2) -> p1.getAge().compareTo(p2.getAge()));// 方法引用简化
people.sort(Comparator.comparing(Person::getAge));

4.3 Stream API 排序

List<Person> sortedPeople = people.stream().filter(p -> p.getAge() > 18)  // 过滤.sorted(Comparator.comparing(Person::getName).reversed()) // 排序.toList();

http://www.xdnf.cn/news/1197325.html

相关文章:

  • solidity从入门到精通 第六章:安全第一
  • vmware虚拟机中 ubuntu 20.04通过nat设置静态ip(固定ip)
  • Java学习-------桥接模式
  • 文件权限标记机制在知识安全共享中的应用实践
  • 通信名词解释:I2C、USART、SPI、RS232、RS485、CAN、TCP/IP、SOCKET、modbus
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的人格品牌化实现路径研究
  • Linux-文件与文本管理
  • 嵌入式软件面试八股文
  • Photo Studio PRO 安卓版:专业级照片编辑的移动解决方案
  • STM32-USART串口实现接收数据三种方法(1.根据\r\n标志符、2.空闲帧中断、3.根据定时器辅助接收)
  • 将远程 main 分支同步到 develop 分支的完整指南
  • 深入理解指针(三)
  • 用 Flask 打造宠物店线上平台:从 0 到 1 的全栈开发实践
  • 2024-2025华为ICT大赛中国区 实践赛网络赛道(高教组)全国总决赛 理论部分真题+解析
  • KNN算法实现图片的识别
  • 实战演练1:实战演练之命名实体识别
  • JavaScript数组去重性能优化:Set与Object哈希表为何效率最高
  • 俄罗斯方块游戏开发(面向对象编程)
  • 通过v4l2,采集视频,FFmpeg编码压缩封装视频(三)
  • Python-初学openCV——图像预处理(三)
  • 01人工智能中优雅草商业实战项目视频字幕翻译以及声音转译之底层处理逻辑阐述-卓伊凡|莉莉
  • Python 数据分析(四):Pandas 进阶
  • macOS配置 GO语言环境
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情分析实现
  • Linux 系统网络配置及 IP 地址相关知识汇总
  • 八股文Kafka学习
  • 哈希表应用(map,set共同作用)
  • 基于 KNN 算法的手写数字识别项目实践
  • DAY21-二叉树的遍历方式
  • vuhub jangow-01-1.0.1靶场攻略