2011-05-28 20 views
1

我必須製作一個程序,按運行時排序歌曲集合。我必須分析一些歌曲,每個歌曲都有一個「標題」字符串,一個「作曲家」字符串和一個「運行時間」整數。輸入將通過stdin傳遞,輸出將在stdout中。按運行時間排序歌曲集合

下面是一個例子輸入:

3 
& 
Pink Frost&Phillipps, Martin&234933 
Se quel guerrier io fossi&Puccini, Giacomo&297539 
Non piu andrai&Mozart&234933 
M'appari tutt'amor&Flotow, F&252905 

輸出:

Se quel guerrier io fossi&Puccini, Giacomo&297539 
M'appari tutt'amor&Flotow, F&252905 
Non piu andrai&Mozart&234933 

我知道我必須通過運行時間整理這些,但我不知道排序算法使用哪個。根據一般的知識,想到的兩個排序算法是合併排序和快速排序,因爲它們似乎是最快的。我也有使用比較器比較集合中兩個「運行時間」元素的想法。

難道有人請指點我正確的方向嗎?

+0

順便說一句--String類有'compareTo(String s)'方法,Integer類也應該有,但是你不應該使用它。在大多數情況下,你只需要**原始**'int'類型。所以比較'int's是隻是簡單的'返回firstInt - secondInt;'更精確...這是你所需要的'公共類TitleComparator實現比較 { \t @覆蓋 \t公衆詮釋比較(MySong firstSong ,MySong second){ \t \t return firstSong.getTitle() - second.getTitle(); \t} }' – dantuch 2011-05-28 10:56:51

回答

0

只需堅持使用compareTo() String或int(運行標題)的方法,並在Comparator中使用它們。下一步 - 使用Collections.sort()它使用合併排序,這是相當不錯:)

啊,並且在運行期間,您應該將這些歌曲添加到歌曲列表 - ArrayListLinkedList。並按Collections.sort(yourListName, new yourComparatorName());

1

排序它們最簡單的方法是編寫一個類來保存上述值,它實現了Comparable接口(或者您可以編寫自己的比較器)。 compareTo方法可以檢查運行時並相應地返回一個值。

然後將它傳遞給Collections.sort()方法。此方法使用合併排序的優化版本。您不必編寫自己的排序邏輯來以這種方式處理它,而且您可以依靠Java平臺爲您做到這一點。除非您需要特定的排序方法性能調整,否則我認爲這是最簡單的方法(KISS - 保持簡單,愚蠢)。

摘錄自Collections.sort上的Java API Docs(http://download.oracle.com/javase/1,5.0/docs/api/java/util/Collections.html#sort%28java.util.List% 29):

排序算法是一個修改的合併排序(如果低位子列表中的最高元素小於高位子列表中的最低元素,則省略合併)。該算法提供了有保證的n log(n)性能。該實現將指定的列表轉儲到數組中,對數組進行排序,然後遍歷列表,以重置數組中相應位置的每個元素。這樣可以避免因試圖對鏈表進行排序而導致的n2 log(n)性能。