TreeSet 和 TreeMap 都以排序顺序存储元素。但是,正是比较器(Comparator)定义了确切的排序顺序。
Java 比较器接口
在 Java 中,Comparator 接口属于 java.util
包的一部分,它定义了用户自定义类的对象顺序。
Comparator 接口的方法
Comparator 接口定义了两个方法:compare() 和 equals()。compare() 方法,如下所示,用于比较两个元素以确定它们的顺序:
compare() 方法
int compare(Object obj1, Object obj2)
obj1
和 obj2
是需要比较的对象。此方法如果对象相等则返回零。如果 obj1
大于 obj2
则返回正数。否则返回负数。
通过重写 compare() 方法,你可以改变对象的排序方式。例如,为了逆序排序,你可以创建一个反转比较结果的比较器。
equals() 方法
boolean equals(Object obj)
obj
是需要测试等价性的对象。如果 obj
和调用对象都是 Comparator 对象并且使用相同的排序规则,则返回 true。否则返回 false。
重写 equals() 通常是不必要的,并且大多数简单的比较器不会这样做。
使用 Comparator 接口对自定义对象进行排序
在此示例中,我们使用 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;
}
public int compareTo(Dog d) {
return (this.name).compareTo(d.name);
}
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[]) {
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("按名字排序:");
System.out.print(list);
Collections.sort(list, new Dog());
System.out.println(" ");
System.out.println("按年龄排序:");
System.out.print(list);
}
}
输出
按名字排序:
[Lacy,2, Roger,10, Shaggy,3, Tammy,1, Tommy,4]
按年龄排序:
[Tammy,1, Lacy,2, Shaggy,3, Tommy,4, Roger,10]
注意
Arrays 类的排序与 Collections 类相同。
使用 Comparator 接口进行逆序排序
在此示例中,我们使用 Comparator 接口对 Dog 对象进行逆序排序。
示例 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;
}
public int compareTo(Dog d) {
return (this.name).compareTo(d.name);
}
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[]) {
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("按名字逆序排序:");
System.out.print(list);
}
}
输出
按名字逆序排序:
[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[]) {
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("按名字逆序排序:");
System.out.print(list);
}
}
输出
按名字逆序排序:
[Tommy, Tammy, Shaggy, Roger, Lacy]