赞
踩
比较器的实质就是重载比较运算符
说到排序了,简单的说就是两个对象之间比较大小,那么在JAVA中提供了两种比较实现的方式,一种是比较死板的采用java.lang.Comparable接口去实现,一种是灵活的当我需要做排序的时候在去选择的java.util.Comparator接口完成。
Comparator这个接口,位于位于java.util包下,排序是comparator能实现的功能之一,该接口代表一个比较器,那么比较的方法就是:
任何比较器:
compare方法里,遵循一个统一的规范:
返回负数的时候,认为第一个参数应该排在前面
返回正数的时候,认为第二个参数应该排在前面
返回0的时候,认为无所谓谁放前面
Arrays 该类包含用于操作数组的各种方法(如排序和搜索)。
public static class Student { public String name; public int id; public int age; public Student(String name, int id, int age) { this.name = name; this.id = id; this.age = age; } } public static class IdShengAgeJiangOrder implements Comparator<Student> { // 根据id从小到大,但是如果id一样,按照年龄从大到小 @Override public int compare(Student o1, Student o2) { return o1.id != o2.id ? (o1.id - o2.id) : (o2.age - o1.age); } } Arrays.sort(students, new IdShengAgeJiangOrder());
Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
当前对象this与指定对象t比较“大小”,如果当前对象this大于指定对象t,则返回正整数,如果当前对象this小于指定对象t,则返回负整数,如果当前对象this等于指定对象t,则返回零。
Comparator:强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。
PriorityQueue:优先级队列(Java语言自身提供的堆结构)。底层就是堆结构,默认是小根堆。
Queue<Integer> heap = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); int[] arr = new int[]{2, 4, 1, 5, 7, 0}; for (int i = 0; i < arr.length; i++) { heap.add(arr[i]); } int k = 3; //求该数组中第三大的元素 k--; while (k-- > 0) { heap.poll(); } System.out.println(heap.peek()); //4
具体流程:
入队:
出队:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。