Java 简明教程
Java - How to Use Comparator?
TreeSet 和 TreeMap 都按排序顺序存储元素。然而,是比较器严格定义了排序顺序的含义。
Methods of Comparator Interface
Comparator 接口定义了两个方法:compare() 和 equals()。下面所示的 compare() 方法比较两个元素的顺序 −
The compare() Method
int compare(Object obj1, Object obj2)
obj1 和 obj2 是要比较的对象。如果对象相等,此方法返回零。如果 obj1 大于 obj2,则它返回正值。否则,返回负值。
通过覆盖比较,你可以改变对象排序的方式。例如,要按相反的顺序排序,你可以创建一个比较器来反转比较结果。
The equals() Method
下面所示的 equals() 方法测试一个对象是否等于调用比较器 −
boolean equals(Object obj)
obj 是要测试是否相等的对象。如果 obj 和调用对象都是 Comparator 对象并且使用相同的排序,则该方法返回 true。否则,它将返回 false。
Overriding equals() 是不必要的,大多数简单的比较器都不会这样做。
Comparator Interface to Sort a Custom Object
在这个示例中,我们使用 Comparator 接口来根据比较条件对自定义对象 Dog 进行排序。
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 相同。
Comparator Interface to Reverse Sort
在这个示例中,我们使用 Comparator 接口对 Dog 进行反向排序。
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 接口对字符串值进行反向排序。
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]