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()
is
1L
so
(int)(new Long(1)。longValue()-其他)
is
1-(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)