在 Java 里,Comparator 是一个函数式接口,它的核心方法是:
int compare(T o1, T o2);
因为接口本身没有实现逻辑,必须你提供比较规则。
Comparator 是一个接口compare,就相当于“告诉 JVM 怎么比较对象”,程序不知道谁大谁小Comparator<Integer> c = new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return a - b; // 升序
}
};
compare 方法在干什么?compare 的返回值含义是固定的:
| 返回值 | 含义 |
|---|---|
< 0 |
o1 小于 o2 |
= 0 |
o1 等于 o2 |
> 0 |
o1 大于 o2 |
排序时,Java 就靠这个返回值决定顺序。
因为 “比较规则”是业务相关的:
这些规则 Java 写不出来,只能你定。
// 按字符串长度排序
Comparator<String> byLength = (a, b) -> a.length() - b.length();
因为用了 Lambda / 方法引用,本质还是在重写:
List<String> list = Arrays.asList("a", "bb", "ccc");
list.sort((s1, s2) -> s1.length() - s2.length());
等价于:
list.sort(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
Comparable 的区别(顺带一提)| 接口 | 谁实现 | 用途 |
|---|---|---|
Comparable |
类本身 | 默认排序 |
Comparator |
外部 | 临时 / 多种排序 |
class Student implements Comparable<Student> {
int age;
public int compareTo(Student o) {
return this.age - o.age;
}
}
Comparator 要重写方法,是因为它只定义“比较的约定”,不提供“比较的逻辑”,逻辑必须由你来实现。
如果你愿意,我也可以给你画 排序调用流程图 或讲 compare 写错的常见坑。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。