在 Java 中,“比较器”通常指 Comparator 或 Comparable 接口。下面用最常见、最实用的方式给你讲清楚,并配上示例。
| 方式 | 接口 | 作用 | 使用场景 |
|---|---|---|---|
| Comparable | compareTo() |
定义自然排序 | 类本身就有固定排序规则 |
| Comparator | compare() |
定义外部比较规则 | 多种排序方式、临时排序 |
类自己实现排序规则
class Person implements Comparable<Person> {
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<Person> 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<Person> comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}
};
Comparator<Person> comparator = (o1, o2) -> o1.age - o2.age;
先按年龄,再按姓名
Comparator<Person> comparator = (o1, o2) -> {
int r = o1.age - o2.age;
if (r != 0) return r;
return o1.name.compareTo(o2.name);
};
Comparator 工具方法(推荐 ✅)Comparator<Person> comparator =
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName);
List<Person> 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 排序),我可以给你针对性示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。