这可能是一个琐碎的问题,但我没有找到任何关于它的信息,所以在这里提出:
当实现
因此,以下代码适用于排序包含类
这个却不行:
当实现
Comparable
接口时,我们应该定义compareTo()
方法,根据文档,以下条件应为真:
对于所有的x和y,sgn(x.compareTo(y)) == -sgn(y.compareTo(x))。
关系是可传递的:(x.compareTo(y)>0 && y.compareTo(z)>0)意味着x.compareTo(z)>0。
x.compareTo(y)==0 意味着对于所有z,sgn(x.compareTo(z)) == sgn(y.compareTo(z))。
如果此对象小于指定对象,则返回负整数,如果相等,则返回零,如果大于指定对象,则返回正整数。
尽管没有要求限制返回值的方式,但大多数实现似乎返回1
、-1
或0
。因此,以下代码适用于排序包含类
Foo
实例的列表(使用Collections.sort()
)。public int compareTo(Foo other){
return this.value > other.value? 1 : this.value < other.value ? -1 : 0;
}
这个却不行:
public int compareTo(Foo other){
return (int)(this.value - other.value);
}
其中value
是一个long
类型的数值,它们之间的差值不超过Integer.MAX_VALUE
。
我是否漏掉了什么,或者返回值必须精确地为1
、-1
或0
,这是否与文档相矛盾?
更新:感谢大家的回答,但似乎人为因素在这里起到了作用。我提到计算出的差值小于Integer.MAX_VALUE
,这应该意味着没有溢出,但我的计算是错误的,所以实际上我确实发生了溢出,这导致了奇怪的结果。