扫码一下
查看教程更方便
TreeSet 和 TreeMap 都按排序顺序存储元素。 但是,比较器准确地定义了排序顺序的含义。
Comparator 接口定义了两个方法:compare( ) 和 equals( )。 此处显示的 compare( ) 方法比较两个元素的顺序
int compare(Object obj1, Object obj2)
obj1 和 obj2 是要比较的对象。 如果对象相等,此方法返回零。 如果 obj1 大于 obj2,则返回正值。 否则,返回负值。
通过重写 compare(),我们可以改变对象的排序方式。 例如,要以相反的顺序排序,可以创建一个比较器来反转比较的结果。
此处显示的 equals( ) 方法测试 Object 是否等于调用比较器
boolean equals(Object obj)
obj 是要测试是否相等的对象。 如果 obj 和调用对象都是 Comparator 对象并且使用相同的顺序,则该方法返回 true。 否则,它返回 false。
重写 equals() 是不必要的,大多数简单的比较器也不会这样做。
import java.util.*; 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 方法对 age 进行排序 public int compare(Dog d, Dog d1) { return d.age - d1.age; } } public class Example { public static void main(String args[]) { // 获取 Dog 对象列表 List<Dog> list = new ArrayList<Dog>(); 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 for(Dog a: list) // 打印 name 的排序列表 System.out.print(a.getDogName() + ", "); // 使用比较器对数组列表进行排序 Collections.sort(list, new Dog()); System.out.println(" "); for(Dog a: list) // 打印 age 的排序列表 System.out.print(a.getDogName() +" : "+ a.getDogAge() + ", "); } }
上面代码的运行结果如下
Lacy, Roger, Shaggy, Tammy, Tommy,
Tammy : 1, Lacy : 2, Shaggy : 3, Tommy : 4, Roger : 10,