如果我有一个要排序的元素列表,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/