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.
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]
Note − Arrays 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]