Java 简明教程

Java - How to Use Comparator?

TreeSet 和 TreeMap 都按排序顺序存储元素。然而,是比较器严格定义了排序顺序的含义。

Both TreeSet and TreeMap store elements in sorted order. However, it is the comparator that defines precisely what sorted order means.

Java Comparator Interface

在 Java 中, Comparator interfacejava.util 包的一部分,它定义了用户定义 classes 的对象的顺序。

In Java, the Comparator interface is a part of java.util package and it defines the order of the objects of user-defined classes.

Methods of Comparator Interface

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

The Comparator interface defines two methods: compare() and equals(). The compare() method, shown here, compares two elements for order −

The compare() Method

int compare(Object obj1, Object obj2)

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

obj1 and obj2 are the objects to be compared. This method returns zero if the objects are equal. It returns a positive value if obj1 is greater than obj2. Otherwise, a negative value is returned.

通过覆盖比较,你可以改变对象排序的方式。例如,要按相反的顺序排序,你可以创建一个比较器来反转比较结果。

By overriding compare(), you can alter the way that objects are ordered. For example, to sort in a reverse order, you can create a comparator that reverses the outcome of a comparison.

The equals() Method

下面所示的 equals() 方法测试一个对象是否等于调用比较器 −

The equals() method, shown here, tests whether an object equals the invoking comparator −

boolean equals(Object obj)

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

obj is the object to be tested for equality. The method returns true if obj and the invoking object are both Comparator objects and use the same ordering. Otherwise, it returns false.

Overriding equals() 是不必要的,大多数简单的比较器都不会这样做。

Overriding equals() is unnecessary, and most simple comparators will not do so.

Comparator Interface to Sort a Custom Object

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

In this example, we’re using Comparator interface to sort a custom object Dog based on comparison criterias.

Example

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;
   }

   // Overriding the compareTo method
   public int compareTo(Dog d) {
      return (this.name).compareTo(d.name);
   }

   // Overriding the compare method to sort the age
   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[]) {
      // Takes a list o Dog objects
      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);   // Sorts the array list
      System.out.println("Sorted by name:");
      // printing the sorted list of names
      System.out.print(list);

      // Sorts the array list using comparator
      Collections.sort(list, new Dog());
      System.out.println(" ");

      System.out.println("Sorted by age:");
      // printing the sorted list of ages
      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]

NoteArrays class 的排序与 Collections 相同。

Note − Sorting of the Arrays class is as the same as the Collections.

Comparator Interface to Reverse Sort

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

In this example, we’re using Comparator interface to reverse sort the Dog objects.

Example 2

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;
   }

   // Overriding the compareTo method
   public int compareTo(Dog d) {
      return (this.name).compareTo(d.name);
   }

   // Overriding the compare method to sort the age
   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[]) {
      // Takes a list o Dog objects
      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());   // Sorts the array list
      System.out.println("Sorted by name in reverse order:");
      // printing the sorted list of names
      System.out.print(list);
   }
}
Sorted by name in reverse order:
[Tommy,4, Tammy,1, Shaggy,3, Roger,10, Lacy,2]

在这个示例中,我们使用 Comparator 接口对字符串值进行反向排序。

In this example, we’re using Comparator interface to sort String values in reverse order.

Example 3

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

public class ComparatorDemo {

   public static void main(String args[]) {
      // Takes a list o Dog objects
      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());   // Sorts the array list
      System.out.println("Sorted by name in reverse order:");
      // printing the sorted list of names
      System.out.print(list);
   }
}
Sorted by name in reverse order:
[Tommy, Tammy, Shaggy, Roger, Lacy]