Java Comparable 和 Comparator 教程展示了如何比较 Java 中具有 Comparable 和 Comparator 接口的对象。 在进行排序时,比较两个对象至关重要。
当使用自定义 Java 对象执行比较时,我们可以使用Comparable
或Comparator
接口。
Java 可比对象
Comparable
接口对实现它的每个类的对象强加了总体排序。 此排序称为类的自然排序。 该类的compareTo()
方法必须实现以提供自然的比较。
Java 比较器
Comparator
接口对某些对象集合强加了整体排序。 可以将比较器传递给排序方法(例如Collections.sort()
或Arrays.sort()
),以实现对排序顺序的精确控制。 比较器还可以用于控制某些数据结构(例如排序集或排序映射)的顺序,或为没有自然顺序的对象集合提供排序。
可比对象与比较器
以下两个列表总结了两个接口之间的区别。
Java 可比对象
- 必须定义
o1.compareTo(o2)
- 用于实现对象的自然排序
- 我们必须修改要对其实例进行排序的类
- 在同一班
- 只有一种实现
- 在 API 中经常通过以下方式实现:字符串,包装类,日期,日历
Java 比较器
- 必须定义
compare(o1, o2)
- 比较类型的两个实例的多种方法-例如 按年龄,姓名比较人
- 我们可以为我们无法控制的类提供比较器
- 我们可以有多个比较器的实现
- 旨在实现对第三方类实例的排序
Java 内置比较器示例
Java 语言提供了一些内置的比较器。
JavaBuiltInComparatorEx.java
在示例中,我们按升序和降序对单词数组进行排序。
Comparator.naturalOrder()
返回内置的自然顺序Comparator
。
Comparator.reverseOrder()
返回一个比较器,该比较器强加自然顺序。
Comparator.comparingInt
Comparator.comparingInt()
方法从提供的类型中提取 int 排序键,并通过该键进行比较。
JavaBuiltInComparatorEx2.java
在示例中,我们使用Comparator.comparingInt()
方法比较了Person
对象的年龄。
对象按年龄排序。
多个比较器
通过Comparator.thenComparing()
方法,我们可以在对对象进行排序时使用多个比较器。
JavaMultipleComparatorsEx.java
我们有Person
对象的列表。 我们先按对象名称比较对象,然后按城市比较对象,最后按年龄比较对象。
Comparator.thenComparing()
方法允许我们将乘法比较器应用于排序操作。
这是输出。
Java 自定义比较器
在下一个示例中,我们创建一个自定义Comparator
。
JavaCustomComparator.java
我们有一个单词表。 这次我们根据单词的长度对其进行比较。
此自定义比较器用于按单词的大小按升序对单词进行排序。
在第二种情况下,单词按降序排序。
This is the output.
Java 自定义比较器 II
在下面的示例中,我们创建两个自定义比较器。
.java
我们有一个Car
对象数组。 我们创建两个自定义比较器,以按对象名称和价格比较对象。
定制的CompareByPrice
比较器实现Comparator
接口; 迫使我们实现compare()
方法。 我们的实现通过价格比较汽车对象。
在第二种情况下,我们通过名称比较汽车对象。
这是出乎意料的。
Java 可比对象示例
在下面的示例中,我们将对象与Comparable
进行比较。
JavaComparableEx.java
我们有Card
对象的列表。 每张卡都有一个值,并且属于西服。 我们实现Comparable
接口,以便为Card
类的对象提供一些自然的排序。
我们实现compareTo()
方法。 我们首先比较卡片的价值,然后根据西装的价值。
This is the output.