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

算法 Arrays.sort()函数自定义排序(Comparator 接口)

Arrays.sort() 的核心功能是对数组元素进行原地排序(即直接修改原数组),支持以下两种排序方式:

  1. 自然排序:适用于实现了 Comparable 接口的元素(如 IntegerStringDate 等)
  2. 自定义排序:通过传入 Comparator 接口的实现类,自定义排序规则

常见的重载形式:

// 自然排序(要求元素实现 Comparable 接口)
public static void sort(int[] a)
public static void sort(Object[] a)// 自定义排序(通过 Comparator 接口)
public static <T> void sort(T[] a, Comparator<? super T> c)// 对部分元素排序(fromIndex 到 toIndex-1)
public static void sort(int[] a, int fromIndex, int toIndex)

一、Comparator 接口的基本定义:

@FunctionalInterface
public interface Comparator<T> {// 比较两个对象,返回值决定顺序int compare(T o1, T o2);// 默认方法(Java 8+新增)default Comparator<T> reversed() { ... }default Comparator<T> thenComparing(Comparator<? super T> other) { ... }// 更多默认方法用于组合比较器
}
  • compare 方法返回值
    • 负数:表示 o1 应排在 o2 前面
    • 0:表示 o1 和 o2 相等
    • 正数:表示 o1 应排在 o2 后面

二、四种核心使用方式

1. 匿名内部类实现(最经典方式) 
String[] names = {"Alice", "Bob", "Charlie", "David"};// 按字符串长度升序排序
Arrays.sort(names, new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.length() - s2.length();}
});
// 排序后:["Bob", "Alice", "David", "Charlie"]

 2. Lambda 表达式(Java 8 + 推荐方式)

// 按字符串长度降序
Arrays.sort(names, (s1, s2) -> s2.length() - s1.length());// 按字母倒序(忽略大小写)
Arrays.sort(names, (s1, s2) -> s2.compareToIgnoreCase(s1));

3. 方法引用

// 按字符串自然顺序排序(等同于 Comparator.naturalOrder())
Arrays.sort(names, String::compareTo);// 按整数升序排序
Integer[] nums = {5, 3, 8, 1};
Arrays.sort(nums, Integer::compare);

4. 使用预定义比较器(Java 8 + 内置方法)

// 自然顺序(升序)
Comparator<String> natural = Comparator.naturalOrder();// 逆序(降序)
Comparator<String> reversed = Comparator.reverseOrder();// 按字符串长度排序
Comparator<String> byLength = Comparator.comparingInt(String::length);// 使用示例
Arrays.sort(names, byLength.reversed()); // 按长度降序

 以 实现的寻找距离原点最近的 k 个点的算法 为例:

  • 输入:二维平面上的点坐标数组points(每个点用 [x,y] 表示),以及整数 k
  • 输出:距离原点 (0,0) 欧几里得距离最近的 k 个点
public int[][] kClosest(int[][] points, int k) {// 对points数组进行排序,自定义比较器按距离从小到大排列Arrays.sort(points, new Comparator<int[]>() {public int compare(int[] point1, int[] point2) {// 计算两个点到原点的距离平方差return (point1[0] * point1[0] + point1[1] * point1[1]) - (point2[0] * point2[0] + point2[1] * point2[1]);}});// 返回排序后的前k个元素return Arrays.copyOfRange(points, 0, k);
}

比较器 (Comparator) 的作用

比较器需要实现compare方法,该方法接收两个参数:

  • point1point2分别代表两个待比较的点(一维数组,长度为 2)
  • 返回值决定了两个元素的顺序:
    • 负数:表示point1应该排在point2前面
    • 正数:表示point1应该排在point2后面
    • 0:表示两个元素相等

通过传入 Comparator 实例,可以对任意类型的数组定义排序规则,避免修改原类

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

相关文章:

  • [网页五子棋][匹配模块]服务器开发、用户管理器(创建匹配请求/响应对象、处理连接成功、处理下线)
  • 根据jvm源码剖析类加载机制
  • Python爬虫实战:研究Tornado框架相关技术
  • [Vue组件]半环进度显示器
  • 小猴子摆玩具
  • 计算机网络第一章计算机网络概述(竟成)
  • 小白成长之路-Linux操作系统-进程管理
  • 【机器人编程基础】python中的常用数据类型
  • ElasticSearch查询指定时间内出现的次数/2秒内出现的次数
  • 我们来学mysql -- 输出一份“数据备份还原”sh脚本
  • 手写字魔法消除1:数据集说明(含下载链接)
  • Kruskal算法剖析与py/cpp/Java语言实现
  • linux中基础IO(上)
  • 浅谈 JavaScript 性能优化
  • 深度解析 Nginx 配置:从性能优化到 HTTPS 安全实践
  • YOLOv8性能提升:引入华为GhostNetv1特征提取网络
  • 第五章 宽松内存一致性模型 A Primer on Memory Consistency and Cache Coherence - 2nd Edition
  • Houdini learning Record
  • Python中的跨域资源共享(CORS)处理
  • CRTP学习笔记与指南
  • MySQL8.4主从复制
  • Mysql学习笔记之事务
  • 大数据未来发展的趋势与挑战
  • 深入详解(0020,0052) Frame of Reference UID在序列空间定位中的定义与作用
  • 【机器学习基础】机器学习入门核心算法:GBDT(Gradient Boosting Decision Tree)
  • 20250528-C#知识:强制类型转换
  • PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums
  • TCP连接数统计脚本
  • 【系统架构设计师】2025年上半年真题论文回忆版: 论系统负载均衡设计方法(包括解题思路和参考素材)
  • 电子电路:压降的定义与原理