java中用comparator配合arrays.sort()实现自定义排序,核心是传入比较逻辑明确的comparator对象;其compare方法返回负数、0、正数分别表示o1排前、相等、o1排后;支持包装类、string及自定义对象排序,需注意数组类型限制、比较器契约及null处理。

Java中用Comparator配合Arrays.sort()实现自定义排序,核心是传入一个比较逻辑明确的Comparator对象——它告诉排序方法“两个元素谁该排在前面”。
理解Comparator接口的作用
Comparator<t></t>是一个函数式接口,只定义了一个抽象方法:int compare(T o1, T o2)。返回值含义很关键:
- 负数(如 -1):表示
o1应排在o2前面 - 0:表示两者相等,顺序可互换
- 正数(如 1):表示
o1应排在o2后面
只要实现这个逻辑,Arrays.sort()就能按你的规则排列数组。
对基本类型包装类或String排序(无需自定义类)
比如对Integer数组降序排列:
Integer[] nums = {3, 1, 4, 1, 5};
Arrays.sort(nums, (a, b) -> b - a); // lambda写法,简洁直观
或者用内置比较器:
Arrays.sort(nums, Collections.reverseOrder());
对String按长度排序:
String[] words = {"apple", "cat", "dog", "elephant"};
Arrays.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
注意避免直接用s1.length() - s2.length()以防整数溢出,推荐用Integer.compare()。
对自定义对象排序(重写compare逻辑)
假设有一个Person类:
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
按年龄升序,年龄相同时按姓名字典序:
Person[] people = {new Person("Alice", 30), new Person("Bob", 25), new Person("Charlie", 30)};
Arrays.sort(people, (p1, p2) -> {
int ageDiff = Integer.compare(p1.age, p2.age);
if (ageDiff != 0) return ageDiff;
return p1.name.compareTo(p2.name);
});
也可用Comparator.comparing()链式调用,更清晰:
Arrays.sort(people, Comparator.comparing((Person p) -> p.age)
.thenComparing(p -> p.name));
注意事项和常见坑
使用时需留意几点:
-
Arrays.sort()只支持对象数组(如Integer[]),不支持基本类型数组(如int[])——后者需用重载方法,不接受Comparator -
Comparator必须满足自反性、对称性、传递性,否则排序结果不可预测 - lambda中避免修改对象状态,只做纯比较
- 若比较字段可能为
null,要用Comparator.nullsFirst()或Comparator.nullsLast()包装
不复杂但容易忽略细节,写清楚比较逻辑,排序就自然正确。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











