【问题标题】:Why does the Java Collections Framework offer two different ways to sort?为什么 Java 集合框架提供两种不同的排序方式?
【发布时间】:2011-02-22 23:47:18
【问题描述】:

如果我有一个想要排序的元素列表,Java 提供了两种方法来解决这个问题。

例如,假设我有一个 Movie 对象列表,我想按标题对它们进行排序。

我可以做到这一点的一种方法是使用我的电影列表作为单个参数调用静态 java.util.Collections.sort( ) 方法的单参数版本。所以我会调用 Collections.sort(myMovieList)。为了使其工作,Movie 类必须声明为实现 java.lang.Comparable 接口,并且必须在该类中实现所需的方法 compareTo()。

另一种排序方法是调用静态 java.util.Collections.sort( ) 方法的两个参数版本,其中电影列表和 java.util.Comparator 对象作为参数。我会调用 Collections.sort(myMovieList, titleComparator)。在这种情况下,Movie 类不会实现 Comparable 接口。相反,在构建和维护电影列表本身的主类中,我将创建一个实现 java.util.Comparator 接口的内部类,并实现一个必需的方法 compare()。然后我会创建这个类的一个实例并调用 sort() 的两个参数版本。第二种方法的好处是您可以创建无限数量的这些内部类比较器,因此您可以以不同的方式对对象列表进行排序。例如,在上面的示例中,您可以使用另一个 Comparator 来按电影的制作年份排序。

我的问题是,既然 Collections.sort( ) 的双参数版本完成了第一个单参数版本所做的所有事情,而且还具有能够排序的额外好处,为什么还要费心学习 Java 中的两种排序方式列表的元素基于几个不同的标准?在编码时必须牢记在心的事情会少一件事。您需要了解一种在 Java 中排序列表的基本机制。

【问题讨论】:

  • 转述您的一个问题:“既然默认的 Java 排序工具是单线程的并且在大中型数据集上表现不佳,为什么还要学习任何默认的 Java 排序方式? " 如果你有一个花生数量的数据,比如 100 000 个元素,那么默认排序应该没问题。但是多达 100 万个元素,在 Core 2 Duo 上,多线程排序已经拥有默认 Java 排序的大倍数。让这几百万和默认的 Java 排序看起来就像 90 年代的可耻残余:stackoverflow.com/questions/2210185
  • @Webinator - 不可能是对 OP 问题之一的合理解释!!
  • @Webinator - 此外,将 Java 的默认排序设置为多线程也是一个坏主意。排序应该“按预期”工作;即在小型数据集上具有良好的性能。如果应用程序需要对怪物数据集进行排序,开发人员应该有责任选择并行算法……或不选择。

标签: java sorting collections comparator comparable


【解决方案1】:

一个是为了简明应该是一个常见的情况(Effective Java 2nd Edition,第 12 条:考虑实现Comparable)。正如您所指出的,另一个是为了灵活性和通用性。

相关问题

【讨论】:

    【解决方案2】:

    这取决于谁控制排序。如果对象的排序是对象的实现细节,Comparable 更合适。如果对象的顺序是由调用者控制的,那么Comparator更合适。

    【讨论】:

      【解决方案3】:

      我不确定我是否觉得这很奇怪。我有一个要排序的事物列表,这些事物具有自然顺序,例如数字。我真的希望我必须告诉 API 如何比较数字吗?直觉上,我不会寻找两个参数的方法。因此 Comparable 存在。

      当然,您可以并且应该能够定义不同的排序,因此可以定义另一种方法。例如,即使数字具有自然排序,我可能仍然想要不同的排序:例如,按值降序排序。因此 Comparator 存在。

      当然,有些东西没有像 Fruit 这样的自然顺序,但您可能仍希望订购它们的列表。又是 Comparator。

      【讨论】:

        猜你喜欢
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        相关资源
        最近更新 更多