[英]How does compare method work?
該程序以升序對數組進行排序,但是在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]));
}
}
因為比較是在對數組進行排序之后執行的,所以Arrays.sort(e)會更改數組e的內容。
移動
System.out.println(e[1].compareTo(e[0]));
到排序之前,它的行為將與您預期的一樣。
compareTo的結果反映了對象和參數之間的特定順序。 排序數組中的第一個和第二個之間始終是+1,並根據compareTo表示的內容進行排序。
這並不表示數字關系!
因為為了對數組進行升序/降序排序,您還更改了example
的compareTo
方法以比較<分別>(即,您在compareTo方法中交換了邏輯)。 這就是為什么它從System.out.println(e[1].compareTo(e[0]));
獲得相同結果的原因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]”。 考慮一下,這有點棘手。
您正在重寫的compareTo(Example ob)
方法中使用Integer.compare(id,compareid)
,並且為您提供信息,
如果id == compareid , 則 Integer.compare(id,compareid)返回值0 ; 如果id <compareid , 則小於0的值; 如果id> compareid ,則該值大於0 。
並且您在對數組進行排序之后調用了compareTo(Example ob)
,這就是為什么該方法總是返回1
。
在對數組進行排序之前,請嘗試調用compareTo(Example ob)
。
compareTo方法稱為其自然比較方法。
當且僅當e1.compareTo(e2)== 0對於C類的每個e1和e2具有與e1.equals(e2)相同的布爾值時,才可以認為C類的自然排序與equals一致。
另請參見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);
您應該在Integer的實例上調用compareTo()方法,而不是靜態的compare()
嘗試這個:
int id;
public int compareTo(Example ob) {
Integer compareid = ob.id;
return compareid.compareTo(id);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.