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

算法 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 实例,可以对任意类型的数组定义排序规则,避免修改原类

相关文章:

  • XCTF-web-fileinclude
  • 在 MATLAB 2015a 中如何调用 Python
  • Golang | gRPC demo
  • JS 逆向太费劲,试试 JS 注入!
  • 题海拾贝:P1208 [USACO1.3] 混合牛奶 Mixing Milk
  • 流程自动化引擎:让业务自己奔跑
  • 深入理解设计模式之职责链模式
  • 2025年电气工程与轨道交通国际会议:绿色能源与智能交通的创新之路
  • IACEES 2025:创新材料与能源模式,迎接未来的挑战
  • 多元素纳米颗粒:开启能源催化新纪元
  • 【AI算法工程师面试指北】大模型微调中的灾难性遗忘该如何避免?
  • 登高架设作业考试中常见的安全规范考点是什么?
  • element-plus主题换色
  • Ubuntu22.04 重装后,串口无响应
  • tauri2项目打开某个文件夹,类似于mac系统中的 open ./
  • 【Pandas】pandas DataFrame between_time
  • 域名解析怎么查询?有哪些域名解析查询方式?
  • DAX权威指南5:筛选上下文、表操作函数与层级结构
  • c语言实现Linux命令行补全机制
  • 如何训练意志力
  • 如皋做网站/优化网站的目的
  • 怎么做网站栏目/优化seo培训班
  • 北京自己怎么做网站/网站开发详细流程
  • 南昌做网站和微信小程序的公司/电商培训内容
  • app开发流程详解/惠州seo
  • 手机网站制作相关文章/网站应该如何进行优化