簡體   English   中英

為什么compareTo方法在排序對象數組時這么慢

[英]Why is compareTo method so slow when sorting an array of objects

我有一個Entry對象數組(它是創建基本電話目錄的解決方案的一部分) - 每個Entry對象包含三個字段(這是電話目錄的數據) public String surname; public String initial; public String number; public String surname; public String initial; public String number;

最初,當將這些添加到數組時(我知道數組不是電話目錄之類的數據結構的一個很好的選擇,但它在規范中),在添加每個條目之后,它被排序 - 這個想法是因為java庫排序使用混合Timsort來查找已經排序的數據的運行,所以它比將條目插入正確的位置並且直接將新條目插入正確的位置幾乎一樣快且簡單得多。

sort方法運行如下

protected void sort() {

    /*
     * Uses comparator because else it fails to sort the null values to the end of the array, and
     * throws null pointer exception instead
     */

    Arrays.sort(this.directory, new Comparator<Entry>() {
        public int compare(Entry entry1, Entry entry2) {
            if (entry1 == null) { // if entries are null will sort to back of
                                // array
                return 1;
            }

            if (entry2 == null) {
                return -1;
            }

            return entry1.surname.compareTo(entry2.surname); //NB this line
        }

    });
}

然而,有人向我指出,直接與另一個對象的字段交互是壞的風格(這是有道理的!)。 所以上面標記的行被替換為return entry1.surname.compareTo(entry2.surname);

這意味着它使用條目類中的compareTo方法。 然而 - 由於某些我不理解的原因 - 這會慢慢減少它。 它可以在一秒鍾內添加3000個條目到超過30秒 - 考慮到下面的compareTo方法,為什么需要這么長時間?

    @Override
public int compareTo(Entry o) {

    if (this.getClass() == null) {
        return -1;
    }

    if (o == null) {
        return 1;
    }

    if (this.surname.equalsIgnoreCase(o.surname)) {
        return this.initial.compareToIgnoreCase(o.initial);
    }

    return this.surname.compareToIgnoreCase(o.surname);

}

您的聯系解析邏輯是反轉的:不是先將先前的等式與姓氏進行比較,而是首先將它們與compareToIgnoreCase進行比較,然后將結果檢查為零。 否則,您實際上兩次進行比較:

int res = this.surname.compareToIgnoreCase(o.surname);
return res != 0 ? res : this.initial.compareToIgnoreCase(o.initial);

假設少數關系,這應該加快你的雙重比較。

此外,您的代碼還有其他低效率:例如,null檢查this.getClass()的結果是沒有意義的,因為它永遠不會為null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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