如何用 Comparator 排序
在 Java 里,Comparator 用来定义“自定义排序规则”,通常与 Collections.sort() 或 List.sort() 一起使用。下面从基础到常见场景给你讲清楚。
一、Comparator 是什么?
Comparator 是一个函数式接口,只有一个核心方法:
int compare(T o1, T o2);
返回值含义:
| 返回值 | 含义 |
|---|---|
| < 0 | o1 排在 o2 前面 |
| = 0 | 相等 |
| > 0 | o1 排在 o2 后面 |
二、最基础示例(自定义排序)
1️⃣ 对整数从大到小排序
List list = Arrays.asList(3, 1, 4, 2);
list.sort(new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; // 降序
}
});
✅ 结果:[4, 3, 2, 1]
三、使用 Lambda 简化(推荐)
list.sort((o1, o2) -> o2 - o1);
或者:
list.sort((o1, o2) -> o1.compareTo(o2)); // 升序
四、对对象排序(最常见)
示例对象
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
}
1️⃣ 按年龄升序排序
List students = new ArrayList<>();
students.add(new Student("Tom", 20));
students.add(new Student("Jack", 18));
students.sort((s1, s2) -> s1.age - s2.age);
2️⃣ 按年龄降序
students.sort((s1, s2) -> s2.age - s1.age);
3️⃣ 按姓名排序(字符串)
students.sort((s1, s2) -> s1.name.compareTo(s2.name));
五、使用 Comparator 工具方法(推荐 ✅)
Java 8 之后,Comparator 提供了很多静态方法,更优雅。
1️⃣ 单条件排序
students.sort(Comparator.comparingInt(s -> s.age));
或:
students.sort(Comparator.comparing(Student::getName));
2️⃣ 降序排序
students.sort(Comparator.comparing(Student::getAge).reversed());
3️⃣ 多条件排序(先年龄,再姓名)
students.sort(
Comparator.comparing(Student::getAge)
.thenComparing(Student::getName)
);
✅ 非常常用!
六、与 Comparable 的区别
| 对比 | Comparator | Comparable |
|---|---|---|
| 所在包 | java.util | java.lang |
| 方法 | compare(o1, o2) | compareTo(o) |
| 是否侵入 | ❌ 不修改原类 | ✅ 修改原类 |
| 灵活性 | ✅ 多种排序规则 | ❌ 只有一种 |
✅ 一般推荐用 Comparator
七、常见坑
❌ 不要用减法排序(可能溢出)
return o1 - o2; // 不推荐
✅ 正确写法:
return Integer.compare(o1, o2);
八、总结一句话
Comparator 就是“告诉 Java 两个对象谁大谁小”,然后排序方法照着排。
如果你愿意,我可以:
- 给你 TreeSet / TreeMap 的 Comparator 示例
- 讲 排序底层原理
- 或针对你具体业务场景写排序代码