在 Java 中,Comparator 用于自定义对象的排序规则,不需要修改类本身(和 Comparable 不同)。下面按常见方式给你总结。
import java.util.*;
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name;
this.age = age;
}
}
// 自定义比较器:按年龄升序
class AgeComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
return Integer.compare(s1.age, s2.age);
}
}
public class Test {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("Tom", 20));
list.add(new Student("Jack", 18));
list.sort(new AgeComparator());
// 或 Collections.sort(list, new AgeComparator());
}
}
✅ compare 返回值规则:
< 0:o1 排在 o2 前面= 0:相等> 0:o1 排在 o2 后面list.sort(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return s1.name.compareTo(s2.name);
}
});
// 按年龄升序
list.sort((s1, s2) -> Integer.compare(s1.age, s2.age));
// 按姓名排序
list.sort((s1, s2) -> s1.name.compareTo(s2.name));
Comparator 静态方法(最优雅 ✅✅)list.sort(Comparator.comparing(Student::getAge));
list.sort(Comparator.comparing(Student::getAge).reversed());
list.sort(
Comparator
.comparing(Student::getAge)
.thenComparing(Student::getName)
);
list.sort(Comparator.nullsLast(Comparator.comparing(Student::getAge)));
TreeSet<Student> set = new TreeSet<>(
Comparator.comparing(Student::getAge)
);
| 对比项 | Comparator | Comparable |
|---|---|---|
| 位置 | 外部定义 | 类内部实现 |
| 灵活性 | 可多个规则 | 只能一种 |
| 使用场景 | 临时/多种排序 | 默认排序 |
如果你有具体排序场景(比如复杂对象、Map 排序、性能问题),可以直接贴代码,我帮你写最合适的 Comparator。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。