在Comparable <Type>类中实现compareTo时,特定的有符号整数是否重要?

jav*_*nix 8 java compareto comparable

在实现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)

pol*_*nts 5

有趣的问题,但尽管如此,根据和规范, 的大小int没有意义,只有符号。可以想象,某些排序算法可以另外指定它们可以从大小中获取“提示”,但我不确定这对于基于比较的排序有多实用,因为我们实际上只需要知道是否、或(这实际上是和是OOP 的抽象)。Comparable<T>Comparator<T>a < ba == ba > bComparableComparator


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

public int compare(T t1, T t2) {
    return t1.intField - t2.intField;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

显然x < z, 然而x - z是一个正数。请注意使用这种减法习惯用法:进行显式比较 and return -10、 or1总是更安全。