验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

Java 比较器怎么返回

阅读:258 来源:乙速云 作者:代码code

Java 比较器怎么返回

在 Java 里,“比较器怎么返回”通常指的是 ComparatorComparablecompare / compareTo 方法要怎么写返回值。核心规则其实很简单,记住一句话就行:

返回负数:当前对象“小于”另一个对象
返回 0:相等
返回正数:当前对象“大于”另一个对象

下面分开讲,并配合常见写法。


一、Comparable(自然排序)

实现 Comparable 接口,重写 compareTo

规则

int compareTo(T o)
  • 返回 负数this < o
  • 返回 0this == 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

⚠️ 注意:如果是 longBigDecimal 或不希望溢出,推荐用 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 < 正数
推荐用 ComparatorXXX.compare()

如果你有具体场景(比如 List 排序、TreeSet、Map、复杂对象),可以直接贴代码,我可以帮你写最合适的比较器。

分享到:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>