程序按升序对数组进行排序,但是在return语句中交换id
和compareid
时,数组按降序排序,但它对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]));
}
}
答案 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)。
另请参阅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);
}