Java可比较的返回值,它必须正好是1、-1还是0?
这可能是一个无关紧要的问题,但我还没有找到任何关于它的信息,所以这里是:Java可比较的返回值,它必须正好是1、-1还是0?,java,comparable,Java,Comparable,这可能是一个无关紧要的问题,但我还没有找到任何关于它的信息,所以这里是: 在实现接口时,我们应该定义方法compareTo(),以便根据文档说明,以下内容是正确的: sgn(x.compareTo(y))==-sgn(y.compareTo(x))用于所有x和y 这个关系是可传递的:(x.compareTo(y)>0&&y.compareTo(z)>0)意味着x.compareTo(z)>0 x、 compareTo(y)==0意味着对于所有z,sgn(x.compareTo(z))==sgn
在实现接口时,我们应该定义方法
compareTo()
,以便根据文档说明,以下内容是正确的:
- sgn(x.compareTo(y))==-sgn(y.compareTo(x))用于所有x和y
- 这个关系是可传递的:(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
,尽管没有提到以这种方式限制返回值的要求。因此,以下代码用于对包含类实例的列表进行排序(使用
Collections.sort()
),Foo
:
public int compareTo(Foo other){
return this.value > other.value? 1 : this.value < other.value ? -1 : 0;
}
其中,值
是一个长
,值之间的差值不超过整数。最大值
我是否在这里遗漏了一些内容,或者返回值要求正好是1
、-1
或0
,与文档矛盾
更新:感谢您的回答,但这里似乎是人为因素造成的。我提到计算出的差值小于Integer.MAX_VALUE,这意味着没有溢出,但我的计算是错误的,所以我确实得到了溢出,这导致了奇怪的结果。合同非常灵活,允许使用
this.VALUE-other.VALUE
习惯用法(后来由于整数溢出而被证明是不正确的)。但在某些情况下,它仍然是可值的,如str.length()-str2.length()
。字符串或数组大小比较不太可能溢出,因为最小长度为0,最大值为integer.MAX\u值
(0-Integer.MAX_值
仍然大于Integer.MIN_值
),因此当您需要按长度/大小排序时,它非常方便
另外,与1/-1相比,0(大于/小于)通常更快/更快地生成更小的字节码/汇编,因此为什么要限制用户?您完全可以自由使用任何正值/负值。Javadocs还说:
在前面的描述中,符号sgn(表达式)指定数学符号函数,,该函数被定义为根据表达式的值是负、零还是正返回-1、0或1中的一个
编辑:
是的,我误解了。你是对的。不,你可以返回你想要的任何整数。你得到的错误到底是什么 请测试以下类别:
public static void main(String[] args) {
final ToSort sort0 = new ToSort(-100);
final ToSort sort1 = new ToSort(1);
final ToSort sort2 = new ToSort(100);
List<ToSort> elements = new ArrayList<ToSort>(){{add(sort2); add(sort1); add(sort0);}};
System.out.println("Unsorted:" + elements.toString());
Collections.sort(elements);
System.out.println("Sorted:" + elements.toString());
}
static class ToSort implements Comparable{
long value;
public ToSort(long value){
this.value = value;
}
@Override
public int compareTo(Object other) {
return (int) (this.value - ((ToSort)other).value);
}
public String toString(){
return ""+value;
}
}
您可能希望在
compareTo
方法中添加一个断点,并进行调试,以检查您是否正在运行预期的结果。是的,但从来没有提到您必须对结果使用sgn
。没有这样的限制,您可以返回所需的任何负整数或正整数,请参考有效的Java。标记为作为解决方案,因为它是导致我找到实际问题的原因。没有错误,列表只是没有排序属性。双返回是一个复制粘贴错误。new Long(1)。longValue()
is1L
so(int)(new Long(1)。longValue()-其他)
is1-(int)其他的
@PeterLawrey确实是,这只是为了演示目的-已经编辑过了,但是(int)(long)
给出了与((int)long)-(int)long)
相同的结果,对吗?@Jave你能举个例子吗?我打赌你不能。;)@彼得拉维:看来你赢了。我以为将长整数转换为整数(或将任何其他基元转换为更少的位)只会截断结果。今天学到了这么多!:p
public static void main(String[] args) {
final ToSort sort0 = new ToSort(-100);
final ToSort sort1 = new ToSort(1);
final ToSort sort2 = new ToSort(100);
List<ToSort> elements = new ArrayList<ToSort>(){{add(sort2); add(sort1); add(sort0);}};
System.out.println("Unsorted:" + elements.toString());
Collections.sort(elements);
System.out.println("Sorted:" + elements.toString());
}
static class ToSort implements Comparable{
long value;
public ToSort(long value){
this.value = value;
}
@Override
public int compareTo(Object other) {
return (int) (this.value - ((ToSort)other).value);
}
public String toString(){
return ""+value;
}
}
run:
Unsorted:[100, 1, -100]
Sorted:[-100, 1, 100]
BUILD SUCCESSFUL (total time: 0 seconds)