在 Java 里,Comparator 是用来定义对象排序规则的一个接口,通常配合 Collections.sort()、List.sort()、Arrays.sort() 或 TreeSet / TreeMap 使用。
下面从最常见用法到进阶用法一步步说明。
Comparator 位于 java.util 包,用来自定义比较规则,不要求对象本身实现 Comparable。
核心方法是:
int compare(T o1, T o2)
返回值含义:
| 返回值 | 含义 |
|---|---|
| < 0 | o1 小于 o2 |
| = 0 | o1 等于 o2 |
| > 0 | o1 大于 o2 |
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
import java.util.*;
public class Test {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("Alice", 20));
list.add(new Person("Bob", 18));
list.add(new Person("Tom", 22));
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age; // 升序
}
});
for (Person p : list) {
System.out.println(p.name + " " + p.age);
}
}
}
输出:
Bob 18
Alice 20
Tom 22
Java 8 以后可以用 Lambda 简化:
list.sort((o1, o2) -> o1.age - o2.age);
或更简洁:
list.sort(Comparator.comparingInt(o -> o.age));
Comparator<Person> byAge = Comparator.comparingInt(p -> p.age);
list.sort(byAge);
list.sort(Comparator.comparingInt(Person::getAge).reversed());
list.sort(
Comparator.comparingInt(Person::getAge)
.thenComparing(Person::getName)
);
Comparator<Person> comparator =
Comparator.nullsFirst(Comparator.comparing(Person::getName));
| 对比项 | Comparable | Comparator |
|---|---|---|
| 包 | java.lang | java.util |
| 方法 | compareTo | compare |
| 是否修改原类 | ✅ 需要 | ❌ 不需要 |
| 排序规则 | 默认排序 | 自定义多种排序 |
✅ 一般建议:
ComparableComparatorTreeSet<Person> set = new TreeSet<>(
Comparator.comparingInt(Person::getAge)
);
list.sort(
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName)
.reversed()
);
如果你愿意,我可以:
你想看哪种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。