簡體   English   中英

比較方法如何工作?

[英]How does compare method work?

該程序以升序對數組進行排序,但是在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]));
    }
}

因為比較是在對數組進行排序之后執行的,所以Arrays.sort(e)會更改數組e的內容。

移動

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

到排序之前,它的行為將與您預期的一樣。

compareTo的結果反映了對象和參數之間的特定順序。 排序數組中的第一個和第二個之間始終是+1,並根據compareTo表示的內容進行排序。

並不表示數字關系!

因為為了對數組進行升序/降序排序,您還更改了examplecompareTo方法以比較<分別>(即,您在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM