问题描述
|
我必须编写一个程序,以按运行时对一组歌曲进行排序。我必须分析歌曲的选择,每首歌曲都带有\“ Title \”字符串,\\“ Composer \”字符串和\“ Running Time \”整数。输入将通过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
我知道我必须按运行时间对它们进行排序,但是我不确定要使用哪种排序算法。根据常识,我想到的两种排序算法是Merge Sort和Quicksort,因为它们似乎平均是最快的。我也有使用比较器比较集合中两个“运行时间”元素的想法。
有人能指出我正确的方向吗?
解决方法
只需对String或int(运行标题)坚持
compareTo()
方法,然后在Comparator
中使用它们。接下来-使用Collections.sort()
,它使用很好的合并排序:)
嗯,在运行时,您应该将这些歌曲添加到歌曲列表-ArrayList
或LinkedList
。并按Collections.sort(yourListName,new yourComparatorName());
排序
, 最简单的方法是编写一个包含上述值的类,该类实现Comparable接口(或者您可以编写自己的Comparator)。 compareTo方法可以检查运行时并相应地返回一个值。
然后将其传递给Collections.sort()方法。此方法使用合并排序的优化版本。您不必编写自己的排序逻辑即可以这种方式进行处理,而您可以依靠Java平台为您完成此操作。除非您需要对排序方法进行特定的性能调整,否则我认为这是最简单的方法(KISS-保持简单,愚蠢)。
摘自Collections.sort上的Java API文档(http://download.oracle.com/javase/1,5.0/docs/api/java/util/Collections.html#sort%28java.util.List%29):
排序算法是一种修改的mergesort(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。该算法提供了有保证的n log(n)性能。此实现将指定的列表转储到数组中,对数组进行排序,然后遍历列表,从数组中的相应位置重置每个元素。这样可以避免因尝试对链表进行适当排序而导致的n2 log(n)性能。