Java 比较器怎么写
在 Java 中,“比较器”通常指 Comparator 或 Comparable 接口。下面用最常见、最实用的方式给你讲清楚,并配上示例。
一、两种方式对比
| 方式 | 接口 | 作用 | 使用场景 |
|---|---|---|---|
| Comparable | compareTo() |
定义自然排序 | 类本身就有固定排序规则 |
| Comparator | compare() |
定义外部比较规则 | 多种排序方式、临时排序 |
二、Comparable(自然排序)
类自己实现排序规则
示例:按年龄排序
class Person implements Comparable {
int age;
String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Person o) {
return this.age - o.age; // 升序
}
}
使用
List list = new ArrayList<>();
list.add(new Person(20, "Tom"));
list.add(new Person(18, "Jack"));
Collections.sort(list);
list.forEach(p -> System.out.println(p.name + " " + p.age));
✅ 输出:
Jack 18
Tom 20
三、Comparator(推荐,更灵活)
1️⃣ 匿名内部类写法(老写法)
Comparator comparator = new Comparator() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}
};
2️⃣ Lambda 写法(最常用 ✅)
Comparator comparator = (o1, o2) -> o1.age - o2.age;
3️⃣ 多条件排序
先按年龄,再按姓名
Comparator comparator = (o1, o2) -> {
int r = o1.age - o2.age;
if (r != 0) return r;
return o1.name.compareTo(o2.name);
};
4️⃣ 使用 Comparator 工具方法(推荐 ✅)
Comparator comparator =
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName);
四、排序使用方式
List list = new ArrayList<>();
// 排序
list.sort(comparator);
// 或
Collections.sort(list, comparator);
五、常见排序规则写法
升序
(o1, o2) -> o1 - o2
降序
(o1, o2) -> o2 - o1
字符串排序
Comparator.comparing(Person::getName)
倒序
Comparator.comparing(Person::getAge).reversed()
六、总结一句话
✅ 类本身有固定顺序 → 用 Comparable
✅ 排序规则多变 / 临时排序 → 用 Comparator(推荐)
如果你有具体场景(比如 Map 排序、对象 List 排序、TreeSet 排序),我可以给你针对性示例。