TreeSet 和 TreeMap 都按排序顺序存储元素。然而,Comparator精确地定义了排序顺序的含义。

Comparator 接口定义了两个方法:compare( ) 和 equals( )。此处所示的compare( ) 方法比较两个元素的顺序 

compare 方法

int compare(Object obj1, Object obj2) 

obj1 和obj2 是要比较的对象。如果对象相等,则此方法返回零。如果 obj1 大于 obj2,则返回正值。否则,将返回负值。

通过重写compare(),您可以更改对象的排序方式。例如,要按相反顺序排序,您可以创建一个反转比较结果的Comparator。

equals 方法

此处显示的 equals( ) 方法用于测试对象是否等于调用Comparator 

boolean equals(Object obj) 

obj 是要测试是否相等的对象。如果 obj 和调用对象都是 Comparator 对象并且使用相同的顺序,则该方法返回 true。否则,它返回 false。

重写 equals( ) 是不必要的,大多数简单的Comparator不会这样做。

示例 1

在这个示例中,我们正在使用 Comparator 接口根据比较标准对自定义对象 Dog 进行排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class Dog implements Comparator<Dog>, Comparable<Dog> {
   private String name;
   private int age;
   Dog() {
   }

   Dog(String n, int a) {
      name = n;
      age = a;
   }

   public String getDogName() {
      return name;
   }

   public int getDogAge() {
      return age;
   }

   // 重写compareTo方法
   public int compareTo(Dog d) {
      return (this.name).compareTo(d.name);
   }

   // 重写compare方法对年龄进行排序
   public int compare(Dog d, Dog d1) {
      return d.age - d1.age;
   }

   @Override
   public String toString() {
      return this.name + "," + this.age;
   }
}

public class ComparatorDemo {

   public static void main(String args[]) {
      // 获取 Dog 对象列表
      List<Dog> list = new ArrayList<>();

      list.add(new Dog("Shaggy", 3));
      list.add(new Dog("Lacy", 2));
      list.add(new Dog("Roger", 10));
      list.add(new Dog("Tommy", 4));
      list.add(new Dog("Tammy", 1));

      Collections.sort(list);   //对数组列表进行排序
      System.out.println("Sorted by name:");
      // 打印排序后的姓名列表
      System.out.print(list);

      // 使用Comparator对数组列表进行排序
      Collections.sort(list, new Dog());
      System.out.println(" ");

      System.out.println("Sorted by age:");
      //打印排序后的年龄列表
      System.out.print(list);
   }
} 

输出

Sorted by name:
[Lacy,2, Roger,10, Shaggy,3, Tammy,1, Tommy,4] 
Sorted by age:
[Tammy,1, Lacy,2, Shaggy,3, Tommy,4, Roger,10] 

注意  Arrays 类的排序与 Collections 相同。

示例 2

在此示例中,我们使用 Comparator 接口对 Dog 对象进行反向排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class Dog implements Comparator<Dog>, Comparable<Dog> {
   private String name;
   private int age;
   Dog() {
   }

   Dog(String n, int a) {
      name = n;
      age = a;
   }

   public String getDogName() {
      return name;
   }

   public int getDogAge() {
      return age;
   }

   // 重写compareTo方法
   public int compareTo(Dog d) {
      return (this.name).compareTo(d.name);
   }

   // 重写compare方法对年龄进行排序
   public int compare(Dog d, Dog d1) {
      return d.age - d1.age;
   }

   @Override
   public String toString() {
      return this.name + "," + this.age;
   }
}

public class ComparatorDemo {

   public static void main(String args[]) {
      // 获取 Dog 对象列表
      List<Dog> list = new ArrayList<>();

      list.add(new Dog("Shaggy", 3));
      list.add(new Dog("Lacy", 2));
      list.add(new Dog("Roger", 10));
      list.add(new Dog("Tommy", 4));
      list.add(new Dog("Tammy", 1));

      Collections.sort(list, Collections.reverseOrder());   //对数组列表进行排序
      System.out.println("Sorted by name in reverse order:");
      // 打印排序后的姓名列表
      System.out.print(list);
   }
} 

输出

Sorted by name in reverse order:
[Tommy,4, Tammy,1, Shaggy,3, Roger,10, Lacy,2] 

在此示例中,我们使用 Comparator 接口以相反的顺序对字符串值进行排序。

示例 3

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ComparatorDemo {

   public static void main(String args[]) {
      // 获取 Dog 对象列表
      List<String> list = new ArrayList<>();

      list.add("Shaggy");
      list.add("Lacy");
      list.add("Roger");
      list.add("Tommy");
      list.add("Tammy");

      Collections.sort(list, Collections.reverseOrder());   //对数组列表进行排序
      System.out.println("Sorted by name in reverse order:");
      // 打印排序后的姓名列表
      System.out.print(list);
   }
} 

输出

Sorted by name in reverse order:
[Tommy, Tammy, Shaggy, Roger, Lacy]