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]