2011-05-29 88 views
1

我使用Collections.sort進行排序對象的ArrayList的,我想看看是否有什麼我試圖做一個更有效的compareTo方法。更高效的compareTo算法?

這裏的方法:

@Override 
public int compareTo(Song s) { 
    if (runningTime > s.runningTime) { 
     return -1; 
    } else if (runningTime < s.runningTime) { 
     return 1; 
    } 
    int lastCmp = title.compareTo(s.title); 
    return (lastCmp != 0 ? lastCmp : composer.compareTo(s.composer)); 
} 

如果任何人都可以提出一個更有效的方法(即更快的運行時間),我將非常感激。

+4

我不明白你的問題的標題有你問的問題怎麼辦? – 2011-05-29 03:36:57

+0

@Vincent Ramdhanie哎呀對不起隊友,我忘了從以前的問題,我會寫更改標題名稱。我很抱歉。 – thatbennyguy 2011-05-29 03:39:30

+6

任何改進都是微不足道的。你的方法對我來說似乎很好。 – MeBigFatGuy 2011-05-29 03:39:49

回答

2

就像MeBigFatGuy說,任何改善是微不足道的,但我覺得你還是可以清理一下代碼,以減少不必要的if-else條件。我的兩分錢。

public int compareTo(Song s) { 
    if (runningTime != s.runningTime) { 
     return s.runningTime - runningTime; 
    } 
    else { 
     int lastCmp = title.compareTo(s.title); 
     return (lastCmp != 0 ? lastCmp : composer.compareTo(s.composer)); 
    } 
} 
+2

返回後不需要其他東西 – Nicolas78 2011-05-29 05:52:24

+0

如果運行時間是雙倍,並且運行時間的差異小於一秒,則這不起作用。最糟糕的是結果不一致;你可以有a = b和b = c但是一個 gnasher729 2014-04-24 16:40:40

2

假設點歌的優先級是固定的(運行時間;如果標題運行時間是相同的;如果作曲家運行時間和標題都一樣),那麼就沒有什麼可以做的更好。如果優先級不固定,那麼也許在標題之前對作曲家進行測試可能會加快速度;這取決於你的實際數據。我會首先在運行時間上進行測試,因爲它總是比字符串比較更快。

0

對我來說也不錯。如果遇到性能問題,您可能會檢查您是否經常排序。不知道現在Collections.sort是否對此敏感,但是如果在插入幾首歌曲後不重新排序已經排序的列表,您可能會獲得某些收益

0

根據讀取屬性值需要多長時間,這可能是一個微小的更快地runningTime和s.runningTime存儲到本地變量第一。因此,平均而言,每次通話只需讀取1.5次或更多次,而不是每次通話讀取一次。