在实现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)
3条答案
按热度按时间v1uwarro1#
这个问题很有趣,但并不重要,根据
Comparable<T>
和Comparator<T>
规范,int
的大小没有意义,只有符号。可以想象,一些排序算法可以额外指定它们可以从大小中获取“提示”,但我不确定这对于基于比较的排序是否实用,因为我们实际上只需要知道a < b
a == b
或a > b
(这实际上是Comparable
和Comparator
的OOP抽象)。现在需要说明的是,这里可能有一个隐藏的意图,就是用减法这个成语来比较数值,也就是说,大概是这样的:
请注意,这种比较方法 * 可能 * 被破坏,因为当两个数之差大于
Integer.MAX_VALUE
时,可能会溢出。实际上,这是Java Puzzlers中涉及的谜题之一。为了证明这一点,请看下面的片段(摘自本书):
显然
x < z
是正数,但x - z
是正数,使用减法时要小心:执行显式比较并使用return -1
、0
或1
总是安全得多。hec6srdp2#
不,唯一的区别是负数0和正数之间的区别。度数无关紧要。
7qhs6swi3#
我发现
Comparator.compare(left, right)
返回的大小对TreeSet
来说很重要。我认为大小在某种程度上给了TreeSet
一个提示,允许在某些情况下跳过比较。我没有花时间完全理解实现细节,但我必须修复下面的比较器。上面的比较器在逻辑上是正确的(即正确地返回负或正),但是当我把对象放入
TreeSet
时,排序并不像预期的那样。问题是String.compareTo(...)
并不总是返回-1、0或1(例如,它可能返回-7或5)。我必须如下修复比较器通过以上修复,我的比较器只能返回-1、0或1,这修复了
TreeSet
排序问题。