Comparator 里“相等”的处理,核心只有一句话:
compare(a, b) == 0 就表示“相等 / 等价”。
下面分几种常见情况说明。
Comparator<T> c;
c.compare(a, b) < 0 → a 排在 b 前面c.compare(a, b) == 0 → a 和 b 被认为是“相等”c.compare(a, b) > 0 → a 排在 b 后面⚠️ 注意:
compare == 0 只表示“排序等价”,不要求 a.equals(b) 为 true。
Comparator<Person> byAge = Comparator.comparing(Person::getAge);
compare == 0如果你不希望“相等”真的相等,而是想继续区分:
Comparator<Person> cmp = Comparator
.comparing(Person::getAge)
.thenComparing(Person::getName);
✅ 这样:
compare == 0 的情况Comparator<Person> cmp = (p1, p2) -> {
if (p1.getId().equals(p2.getId())) {
return 0;
}
return p1.getAge() - p2.getAge();
};
✅ 表示:
List.sort() / Collections.sort():稳定排序compare(a, b) == 0,原来在前面的仍然在前面// 稳定排序下
compare == 0 → 不交换顺序
TreeSet<Person> set = new TreeSet<>(
Comparator.comparing(Person::getAge)
);
⚠️ 问题:
compare == 0equals 不一样)✅ 正确做法:
Comparator<Person> cmp = Comparator
.comparing(Person::getAge)
.thenComparing(Person::getId);
❌ 忘记处理相等情况
❌ 用 Comparator 当 equals 用
❌ 在 TreeSet 里只比较部分字段
✅ 经验法则:
如果
compare == 0,就当它们是“同一个东西”
Comparator 中:
compare(a,b) == 0= 相等
如果你不想“相等”,就继续thenComparing
如果你有具体场景(排序 / TreeSet / 自定义对象 / 性能问题),可以直接贴代码,我可以帮你改到最优。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。