8

在实现 compareTo() 时,是否需要考虑“差异”的程度?

例如,如果我有 3 个对象,C1、C2 和 C3,则 C1 < C2 < C3。

C1.compareTo(C2) 是否应该返回一个小于 C2.compareTo(C3) 的整数?

Comparable 接口的文档似乎没有指定一种或另一种方式,所以我猜度数并不重要,但很高兴知道返回特定数字是否有一些优势(例如,改进TreeSet 排序速度什么的)。

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Comparable.html#compareTo(T)

4

2 回答 2

4

有趣的问题,但仍然没有,根据规范,它的大小没有int意义,只有符号。可以想象,一些排序算法可以额外指定它们可以从大小中获取“提示”,但我不确定这对于基于比较的排序有多实用,因为我们真的只需要知道 if , , or (这真的是什么和是 OOP 抽象)。Comparable<T>Comparator<T>a < ba == ba > bComparableComparator


现在需要说的是,这里可能有一个隐藏的意图,即使用减法习语来比较数值,例如:

public int compare(T t1, T t2) {
    return t1.intField - t2.intField;
}

请注意,这种比较方法可能会被破坏,因为当两个数字之间的差大于 时可能会溢出Integer.MAX_VALUE。事实上,这是Java Puzzlers中涵盖的谜题之一。

为了演示,请考虑以下片段(摘自书中):

int x = -2000000000;
int z = 2000000000;
System.out.println(x - z); // prints a positive number due to overflow

显然x < z,x - z是一个正数。小心使用这种减法习语:进行显式比较总是更安全 and return -1, 0, or1代替。

于 2010-04-14T01:28:36.620 回答
2

不,唯一的区别是负数、0 和正数。学位无关紧要。

于 2010-04-13T23:06:43.597 回答