在 Java 里,“比较器怎么返回”通常指的是 Comparator 或 Comparable 的 compare / compareTo 方法要怎么写返回值。核心规则其实很简单,记住一句话就行:
返回负数:当前对象“小于”另一个对象
返回 0:相等
返回正数:当前对象“大于”另一个对象
下面分开讲,并配合常见写法。
实现 Comparable<T> 接口,重写 compareTo。
int compareTo(T o)
this < othis == othis > oclass Person implements Comparable<Person> {
int age;
public Person(int age) {
this.age = age;
}
@Override
public int compareTo(Person o) {
return this.age - o.age; // 按年龄升序
}
}
✅ 升序:this.age - o.age
❌ 降序:o.age - this.age
⚠️ 注意:如果是
long、BigDecimal或不希望溢出,推荐用Integer.compare(this.age, o.age)
用于临时排序,不修改原类。
int compare(T o1, T o2)
o1 < o2o1 == o2o1 > o2Comparator<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 工具方法(推荐)Comparator<Person> comparator =
Comparator.comparingInt(p -> p.age);
return o1.age - o2.age;
// 或
return Integer.compare(o1.age, o2.age);
return o2.age - o1.age;
// 或
return Integer.compare(o2.age, o1.age);
Comparator<Person> comparator =
Comparator.comparingInt((Person p) -> p.age)
.thenComparing(p -> p.name);
很多人会问:
是不是返回 1 就表示前面的大?
✅ 是的,但更准确的说法是:
返回正数,表示
o1 > o2
排序逻辑是由 排序算法 根据返回值决定的,不是写死“1 在前”。
❌ 直接返回 1 或 -1
return 1; // 错误,会破坏排序语义
❌ 用减法比较 long / BigDecimal
return (int)(o1.getValue() - o2.getValue()); // 可能溢出
✅ 正确写法
return Long.compare(o1.getValue(), o2.getValue());
✅ 比较器返回值是“大小关系”
✅ 负数 < 0 < 正数
✅ 推荐用 Comparator 和 XXX.compare()
如果你有具体场景(比如 List 排序、TreeSet、Map、复杂对象),可以直接贴代码,我可以帮你写最合适的比较器。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。