Java 比较器怎么返回
在 Java 里,“比较器怎么返回”通常指的是 Comparator 或 Comparable 的 compare / compareTo 方法要怎么写返回值。核心规则其实很简单,记住一句话就行:
返回负数:当前对象“小于”另一个对象
返回 0:相等
返回正数:当前对象“大于”另一个对象
下面分开讲,并配合常见写法。
一、Comparable(自然排序)
实现 Comparable 接口,重写 compareTo。
规则
int compareTo(T o)
- 返回 负数:
this < o - 返回 0:
this == o - 返回 正数:
this > o
示例
class Person implements Comparable {
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)
二、Comparator(外部比较器)
用于临时排序,不修改原类。
规则
int compare(T o1, T o2)
- 负数:
o1 < o2 - 0:
o1 == o2 - 正数:
o1 > o2
示例 1:匿名内部类
Comparator comparator = new Comparator() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}
};
示例 2:Lambda(常用)
Comparator comparator =
(o1, o2) -> o1.age - o2.age;
示例 3:使用 Comparator 工具方法(推荐)
Comparator 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 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、复杂对象),可以直接贴代码,我可以帮你写最合适的比较器。