MENU

Java-54 比较器

November 10, 2023 • Read: 72 • Java阅读设置

比较器

比较器能够使得无法直接进行比较运算的类的对象,实现能够比较的特性。比如自定义的商品类,其对象就无法直接进行比较。

比较器实际上就是实现比较特性的接口。

有两种实现比较特性的接口:

  • 自然排序:java.lang.Comparable
  • 定制排序:java.util.Comparator

1 Comparable接口

1 什么是Comparable接口

Comparable接口对实现它的每个类的对象施加了一个总的排序。这种排序被称为类的自然排序,而类的compareTo方法被称为其自然比较方法。
自然排序可以理解为默认的排序,自然排序方式是类的对象之间进行比较时的默认比较方式。

实现Comparable接口需要实现其compareTo(Object o)方法,该方法就是定义对应类的对象的比较方式,其针对的是该类的当前对象与传入的参数对象(通常就是指该类的另一个对象)的比较方式,这意味着,该类的所有对象进行比较时都遵循这种比较方式,实现该方法需要满足的规则的是:

  • 如果对应对象大于参数对象,则返回正整数;
  • 如果对应对象小于参数对象,则返回负整数;
  • 如果对应对象与参数对象相等,则返回0。

一般来说,建议自然排序与equals一致:即对于一个类的两个对象e1和e2,满足e1.compareTo(e2) == 0e1.equals(e2)具有相同的boolean值。

一般的,像String, 包装类等都是Comparable接口的实现类,重写了对应的compareTo()方法,因此这些类的对象具有比较特性,可以直接进行比较。

2 示例

2023-11-10T13:22:10.png
2023-11-10T13:22:29.png

2 Comparator接口

当元素类型没有实现java.lang.Comparable接口而又不方便修改代码,比如有的jdk提供的工具类;或者实现了的java.lang.Comparable接口的排序方式不适合当前的场景,比如某场景要求String对象按照字母表逆序排序,这时就可以考虑使用Comparator来实现排序。

Comparator接口可以简单地理解为一种不针对特定类的比较器,即在需要的时候,根据具体场景及具体对象,实现的对象之间的比较方式。

实现Comparator接口需要实现其int compare(T o1,T o2)方法,该方法就是针对参数对象o1, o2的比较方式,其对应规则为:

  • 如果对象o1大于o2,则返回正整数;
  • 如果对象o1小于o2,则返回负整数;
  • 如果两个对象相等,则返回0。

可以将Comparator对应的实现对象传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精准控制。比如:
Arrays工具类中的public static <T> void sort(T[] a, Comparator<? super T> c)方法,表示根据传入的Comparator对象来对传入的数组a进行排序。

2 示例

2023-11-10T13:53:53.png