Java 提供了两个接口来使用类的数据成员对对象进行排序:
1. 可比
2. 比较器
使用可比接口
一个可比较的对象能够将自己与另一个对象进行比较。类本身必须实现java.lang.Comparable接口来比较它的实例。
考虑一个 Movie 类,它的成员喜欢、评级、名称、年份。假设我们希望根据发行年份对电影列表进行排序。我们可以用Movie类实现Comparable接口,我们重写Comparable接口的compareTo()方法。
输出:
排序后的电影:
星球大战 8.7 1977
帝国反击战 8.8 1980
绝地归来 8.4 1983
原力觉醒 8.3 2015
现在,假设我们还想按电影的评分和名称对电影进行排序。当我们使一个集合元素具有可比性(通过让它实现 Comparable)时,我们只有一次机会实现 compareTo() 方法。解决方案是使用比较器。
使用比较器
与 Comparable 不同,Comparator 在我们要比较的元素类型之外。这是一个单独的班级。我们创建多个单独的类(实现 Comparator)以由不同的成员进行比较。
Collections 类有第二个 sort() 方法,它需要 Comparator。sort() 方法调用 compare() 对对象进行排序。
要按评分比较电影,我们需要做 3 件事:
1. 创建一个实现 Comparator 的类(以及执行之前由 compareTo() 完成的工作的 compare() 方法)。
2. 创建 Comparator 类的实例。
3. 调用重载的 sort() 方法,给它列表和实现 Comparator 的类的实例。
输出 :
按评分排序
8.3 原力觉醒 2015
8.4 绝地归来 1983
8.7 星球大战 1977
8.8 帝国反击战 1980
按名称排序
帝国反击战 8.8 1980
原力觉醒 8.3 2015
绝地归来 8.4 1983
星球大战 8.7 1977
按年份排序
1977 8.7 星球大战
1980 8.8 帝国反击战
1983 8.4 绝地归来
2015 8.3 原力觉醒
· Comparable 适用于具有自然排序的对象,这意味着对象本身必须知道如何对其进行排序。例如学生人数。而 Comparator 接口排序是通过一个单独的类完成的。
· 从逻辑上讲,Comparable 接口将“this”引用与指定的对象进行比较,Java 中的 Comparator 比较提供的两个不同的类对象。
· 如果任何类在 Java 中实现 Comparable 接口,则可以使用 Collections.sort() 或 Arrays.sort() 方法自动对该对象的集合 List 或 Array 进行排序,并且对象将根据 CompareTo 方法定义的自然顺序进行排序。
· 一个基本的区别特征是,使用可比较我们只能使用一个比较。然而,我们可以为给定类型编写多个自定义比较器,所有这些都使用对排序含义的不同解释。就像在可比较的示例中一样,我们只能按一个属性(即年份)进行排序,但在比较器中,我们也可以使用不同的属性,例如评级、姓名和年份。
总而言之,如果对象的排序需要基于自然顺序,则使用 Comparable,而如果需要对不同对象的属性进行排序,则使用 Java 中的 Comparator。
留言与评论(共有 0 条评论) “” |