Comparator 如何自定义排序
在 Java 中,Comparator 用于自定义排序规则,常见用法有 匿名内部类、Lambda 表达式、方法引用、多条件排序 等。下面系统讲解。
一、最基本用法(自定义排序规则)
示例:按年龄升序排序
class Person {
int age;
String name;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
使用 Comparator
List list = new ArrayList<>();
list.add(new Person("Alice", 20));
list.add(new Person("Bob", 18));
// 按 age 升序
list.sort((p1, p2) -> p1.age - p2.age);
✅ 返回值含义:
< 0:p1 排在 p2 前面= 0:相等> 0:p1 排在 p2 后面
二、常见写法汇总
1️⃣ Lambda 表达式(推荐)
list.sort((p1, p2) -> p1.age - p2.age);
2️⃣ 匿名内部类(旧写法)
list.sort(new Comparator() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}
});
3️⃣ 使用 Comparator.comparing()(推荐 ✅)
list.sort(Comparator.comparing(p -> p.age));
或:
list.sort(Comparator.comparing(Person::getAge));
三、降序排序
方式一:reverse
list.sort(Comparator.comparing(Person::getAge).reversed());
方式二:手动反转
list.sort((p1, p2) -> p2.age - p1.age);
四、多条件排序(非常常见)
示例:先按年龄,再按姓名
list.sort(
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName)
);
多条件 + 降序
list.sort(
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName, Comparator.reverseOrder())
);
五、对集合排序的几种方式
方式一:Collections.sort
Collections.sort(list, Comparator.comparing(Person::getAge));
方式二:List.sort
list.sort(Comparator.comparing(Person::getAge));
六、对数组排序
Person[] arr = new Person[2];
arr[0] = new Person("Alice", 20);
arr[1] = new Person("Bob", 18);
Arrays.sort(arr, Comparator.comparing(Person::getAge));
七、处理 null 值(非常重要)
允许 null 排在最后
list.sort(Comparator.nullsLast(Comparator.comparing(Person::getAge)));
null 排在最前
list.sort(Comparator.nullsFirst(Comparator.comparing(Person::getAge)));
八、Comparator vs Comparable 区别
| 对比项 | Comparator | Comparable |
|---|---|---|
| 所在类 | 外部定义 | 类内部实现 |
| 方法 | compare(T o1, T o2) |
compareTo(T o) |
| 是否侵入 | 否 | 是 |
| 适合场景 | 多种排序规则 | 默认排序 |
✅ 实际开发中:优先使用 Comparator
九、完整示例
list.sort(
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName, Comparator.reverseOrder())
);
如果你愿意,可以告诉我:
- ✅ 是 Java 对象排序 / Map 排序 / 字符串排序
- ✅ 是否 升序 / 降序 / 多条件
- ✅ 是否涉及 null、中文、数字字符串
我可以直接帮你写✔️最优代码。