5

如果我有一个想要排序的元素列表,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() 的两个参数版本。第二种方法的好处是您可以创建无限数量的这些内部类比较器,因此您可以以不同的方式对对象列表进行排序。在上面的例子中,

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

4

3 回答 3

14

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

相关问题

于 2010-05-23T18:46:46.883 回答
6

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

于 2010-05-23T18:47:12.343 回答
3

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

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

当然,有些东西没有像 Fruit 这样的自然顺序,但您可能仍希望订购它们的列表。因此比较器,再次。

于 2010-05-23T18:47:40.057 回答