比较器
当排序不是程序的主要内容时,使用自定义比较器能够较快的实现排序目的。需要实现 Comparator 接口。
/** * 比较器 */ public class ComparatorTest01 { public static void main(String[] args) { Integer[] arr = {4, 5, 3, 2, 4, 5, 6, 72, 4, 7, 2, 4}; Arrays.sort(arr, new MyComparator()); System.out.println(Arrays.toString(arr)); } } class MyComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }
在构建 PriorityQueue 、 TreeMap 、 TreeSet 时可以传入一个比较器,这时候加入自定义数据类型就会根据制定的比较器规则进行排序。
举个例子:设计一个比较的类 Person,将会对 Person 类的属性 id 进行比较。
class Person { private int id; private String name; public Person() { } public Person(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
然后设计一个比较器 IdComparator,将
class IdComparator implements Comparator<Person> { @Override public int compare(Person o1, Person o2) { return o2.getId() - o1.getId(); } }
测试一下
public class ComparatorTest02 { public static void main(String[] args) { Person p1 = new Person(1, "张三"); Person p2 = new Person(2, "李四"); Person p3 = new Person(3, "王五"); TreeSet<Person> set = new TreeSet<>(new IdComparator()); set.add(p1); set.add(p2); set.add(p3); for (Person p : set) { System.out.println(p); } } }
output: Person{id=3, name='王五'} Person{id=2, name='李四'} Person{id=1, name='张三'}
查看以上的输出结果,自定义比较器做到了以 Id 降序比较,TreeSet 构建方法传入了比较器。