java - 为什么 Java 集合框架提供两种不同的排序方式?

标签 java sorting collections comparator comparable

如果我有一个要排序的元素列表,Java 提供了两种方法来进行排序。

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

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

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

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

最佳答案

一个是为了简化常见情况(Effective Java 2nd Edition,Item 12:Consider implementing Comparable)。另一个,正如您所指出的,是为了灵 active 和通用性。

相关问题

关于java - 为什么 Java 集合框架提供两种不同的排序方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2892947/

相关文章:

c# - 从 Dictionary<Key, Item> 中移除元素

java - 被政策拒绝

java - HashMap 中的内容适当的数据

java - 为 Eclipse 安装 Drools 插件时出错

java - 使用另一个列表对一个列表进行排序。根据第二个列表交换项目

Javascript:将包含日期的数组按降序排序

python - 如何按列值的计数进行分组并对其进行排序?

java - 如何对Arraylist的类别进行排序?

java - Dozer 枚举到枚举映射

java - 从 Scala 到 Java 的翻译