比较方法如何工作?

时间:2014-07-03 08:24:36

标签: java

程序按升序对数组进行排序,但是在return语句中交换idcompareid时,数组按降序排序,但它对System.out.println(e[1].compareTo(e[0]));的输出没有影响在两种情况下都返回1。为什么会这样?

package example;

import java.util.Arrays;

class Example implements Comparable<Example> {
    int id;

    public int compareTo(Example ob) {
        int compareid = ob.id;
        return Integer.compare(id, compareid); // problem
    }
}

class comparableinterface {
    public static void main(String args[]) {
        Example e[] = new Example[3];
        e[0] = new Example();
        e[0].id = 2;
        e[1] = new Example();
        e[1].id = 3;
        e[2] = new Example();
        e[2].id = 0;
        Arrays.sort(e);
        for (Example temp : e) {
            System.out.println(temp.id);
        }
        System.out.println(e[1].compareTo(e[0]));
    }
}

6 个答案:

答案 0 :(得分:3)

因为在对数组进行排序后正在执行比较,并且Arrays.sort(e)更改了数组e的内容。

移动

System.out.println(e[1].compareTo(e[0]));

到排序之前,它将按预期运行。

答案 1 :(得分:1)

compareTo的结果反映了对象和参数之间的某种顺序。在排序数组中,第一个和第二个之间始终为+1,根据compareTo表示的内容进行排序。

表示数字关系!

答案 2 :(得分:0)

因为为了对数组进行升序/降序排序,您还需要更改compareTo中的example方法,以便比较&lt;分别> (即你在compareTo方法中交换逻辑)。这就是为什么它会从System.out.println(e[1].compareTo(e[0]));给你相同的结果。基本上在更改之后,您的compareTo不再检查“更小”,但检查“更大”。因此即使System.out.println(e[1].compareTo(e[0]));在两种情况下都返回1,在第一种情况下它会告诉你“e [1]大于e [0]”,而在第二种情况下它告诉你“e [1]小于E [0]”。考虑到这一点,这有点棘手。

答案 3 :(得分:0)

您在覆盖的compareTo(Example ob)方法中使用了Integer.compare(id,compareid),并提供了相关信息,

  

如果id == compareid ,则Integer.compare(id,compareid)返回值 0;如果id <1,则值小于0。 compareid ;如果id>,则值大于0 compareid

在对数组进行排序后,您正在调用compareTo(Example ob),这就是该方法始终返回1的原因。

在排序数组之前尝试调用compareTo(Example ob)

答案 4 :(得分:0)

  

compareTo方法被称为其自然比较方法。

     

C类的自然排序据说是一致的   当且仅当e1.compareTo(e2)== 0具有相同的布尔值时才等于   作为C类的每个e1和e2的e1.equals(e2)。

Ref

另请参阅java.utils.Arrays.mergeSort()源代码以了解compareTo如何用于对数组进行排序:

for (int j=i; j>low &&
             ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
                    swap(dest, j, j-1);

答案 5 :(得分:0)

您应该在Integer的实例上调用compareTo()方法,而不是静态比较()

试试这个:

int id;
public int compareTo(Example ob) {

        Integer compareid = ob.id;
        return compareid.compareTo(id);
    }