在 Java 里,Comparator 用来定义“自定义排序规则”,通常与 Collections.sort() 或 List.sort() 一起使用。下面从基础到常见场景给你讲清楚。
Comparator<T> 是一个函数式接口,只有一个核心方法:
int compare(T o1, T o2);
返回值含义:
| 返回值 | 含义 |
|---|---|
| < 0 | o1 排在 o2 前面 |
| = 0 | 相等 |
| > 0 | o1 排在 o2 后面 |
List<Integer> list = Arrays.asList(3, 1, 4, 2);
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; // 降序
}
});
✅ 结果:[4, 3, 2, 1]
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;
}
}
List<Student> students = new ArrayList<>();
students.add(new Student("Tom", 20));
students.add(new Student("Jack", 18));
students.sort((s1, s2) -> s1.age - s2.age);
students.sort((s1, s2) -> s2.age - s1.age);
students.sort((s1, s2) -> s1.name.compareTo(s2.name));
Comparator 工具方法(推荐 ✅)Java 8 之后,Comparator 提供了很多静态方法,更优雅。
students.sort(Comparator.comparingInt(s -> s.age));
或:
students.sort(Comparator.comparing(Student::getName));
students.sort(Comparator.comparing(Student::getAge).reversed());
students.sort(
Comparator.comparing(Student::getAge)
.thenComparing(Student::getName)
);
✅ 非常常用!
| 对比 | Comparator | Comparable |
|---|---|---|
| 所在包 | java.util | java.lang |
| 方法 | compare(o1, o2) | compareTo(o) |
| 是否侵入 | ❌ 不修改原类 | ✅ 修改原类 |
| 灵活性 | ✅ 多种排序规则 | ❌ 只有一种 |
✅ 一般推荐用 Comparator
return o1 - o2; // 不推荐
✅ 正确写法:
return Integer.compare(o1, o2);
Comparator 就是“告诉 Java 两个对象谁大谁小”,然后排序方法照着排。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。