【发布时间】: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