【问题标题】:Sorting a collection of songs by runtime按运行时对歌曲集进行排序
【发布时间】:2011-05-28 06:10:19
【问题描述】:

我必须制作一个按运行时间对歌曲集进行排序的程序。我必须分析选择的歌曲,每首歌曲都有一个“Title”字符串、一个“Composer”字符串和一个“Running Time”整数。输入将通过标准输入进行管道传输,输出将在标准输出中。

这是一个示例输入:

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

我知道我必须按运行时间对它们进行排序,但我不确定要使用哪种排序算法。根据一般知识,想到的两种排序算法是合并排序和快速排序,因为它们似乎是平均最快的。我也有使用 Comparator 来比较 Collection 中的两个“运行时间”元素的想法。

有人可以指点我正确的方向吗?

【问题讨论】:

  • 顺便说一句 - String 类有 compareTo(String s) 方法,Integer 类也应该有它,但你永远不应该使用它。在大多数情况下,您只需要 primitive int 类型。所以比较ints 就像return firstInt - secondInt; 一样简单,更准确地说……这就是你需要的public class TitleComparator implements Comparator<MySong> { @Override public int compare(MySong firstSong, MySong second) { return firstSong.getTitle() - second.getTitle(); } }

标签: java algorithm sorting


【解决方案1】:

最简单的方法是编写一个类来保存上述值,该类实现 Comparable 接口(或者您可以编写自己的 Comparator)。 compareTo 方法可以检查运行时并相应地返回一个值。

然后将其传递给 Collections.sort() 方法。此方法使用优化版本的合并排序。您不必编写自己的排序逻辑来处理它,您可以依靠 Java 平台为您完成。除非您需要对排序方法进行特定的性能调整,否则我想这是最简单的方法(KISS - Keep It Simple, Stupid)。

关于 Collections.sort 的 Java API 文档摘录 (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) 性能。

【讨论】:

    【解决方案2】:

    只需坚持使用 compareTo() 方法获取 String 或 int(运行小标题)并在您的 Comparators 中使用它们。接下来 - 使用Collections.sort(),它使用非常好的合并排序:)

    啊,在运行时,您应该将这些歌曲添加到歌曲列表中 - ArrayListLinkedList。并按Collections.sort(yourListName, new yourComparatorName());排序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      相关资源
      最近更新 更多