Comparator
是 Java 中的一个接口,用于定义对象之间的排序规则。它可以用于对集合中的对象进行排序,或者用于自定义排序算法。
优先队列中可以通过重写comparator接口来实现大根堆或者小根堆,让我迷惑的是comparate方法中什么时候是asc什么时候是desc
class Sortbyroll implements Comparator<Student> {
// Method
// Sorting in ascending order of roll number
public int compare(Student a, Student b)
{
return a.rollno - b.rollno;
}
}
class Sortbyroll2 implements Comparator<Student> {
// Method
// Sorting in desc order of roll number
public int compare(Student a, Student b)
{
return b.rollno - a.rollno;
}
}
compareTo() 方法
用于将 Number 对象与方法的参数进行比较。
返回值
-
如果指定的数与参数相等返回 0。
-
如果指定的数小于参数返回 -1。
-
如果指定的数大于参数返回 1。
class Sortbyname implements Comparator<Student> { // Method // Sorting in ascending order of name public int compare(Student a, Student b) { return a.name.compareTo(b.name); } }
PriorityQueue
PriorityQueue是一个实现了Queue接口的类,它可以根据元素的优先级来排序和检索。PriorityQueue的常用方法有:
- add(E e):将指定的元素插入到优先队列中,如果队列已满,会抛出异常。
- offer(E e):将指定的元素插入到优先队列中,如果队列已满,会返回false。
- peek():返回优先队列的头部元素,但不删除它,如果队列为空,会返回null。
- poll():返回并删除优先队列的头部元素,如果队列为空,会返回null。
- remove(Object o):从优先队列中删除指定的元素,如果成功,会返回true,否则返回false。
- contains(Object o):判断优先队列是否包含指定的元素,如果包含,会返回true,否则返回false。
- size():返回优先队列的元素个数。
- toArray():将优先队列转换为一个数组,并返回它。
- comparator():返回优先队列使用的比较器,如果使用的是元素的自然顺序,会返回null。
优先队列的元素可以是基本类型的包装类,也可以是自定义的类,但必须实现Comparable接口或者提供一个Comparator对象来定义元素的比较规则。默认情况下,优先队列的头部元素是最小的元素,也就是说,元素按照升序排列。如果想要按照降序排列,可以使用Collections.reverseOrder()方法来创建一个反向的比较器。
offer和add
add和offer都是用于向优先队列中添加元素的方法,但是它们有一些区别。主要的区别是,当优先队列的容量有限制时,add方法会在无法添加元素时抛出异常,而offer方法会在无法添加元素时返回false。
例如,如果我们创建一个容量为3的优先队列,如下:
PriorityQueue<Integer> pq = new PriorityQueue<>(3);
然后我们尝试向这个队列中添加4个元素,如下:
pq.add(1); // 成功,返回true
pq.add(2); // 成功,返回true
pq.add(3); // 成功,返回true
pq.add(4); // 失败,抛出IllegalStateException异常
如果我们使用offer方法,结果如下:
pq.offer(1); // 成功,返回true
pq.offer(2); // 成功,返回true
pq.offer(3); // 成功,返回true
pq.offer(4); // 失败,返回false
下面是一个使用PriorityQueue的简单示例,它创建了一个存放整数的优先队列,并按照降序排列,为大根堆。
正常不定义时候是小根堆,asc排序。
// 定义一个实现了Comparator接口的类
class ReverseComparator implements Comparator<Integer> {
// 实现compare方法,返回两个元素的大小关系
public int compare(Integer a, Integer b) {
return b - a;
}
}
public class PriorityQueueExample {
public static void main(String[] args) {
// 创建一个优先队列,使用自定义的比较器
PriorityQueue<Integer> pq = new PriorityQueue<>(new ReverseComparator());
// 向优先队列中添加元素
pq.add(10);
pq.add(20);
pq.add(15);
// 打印优先队列的头部元素
System.out.println("队列的头部元素: " + pq.peek());
// 遍历并删除优先队列的元素
while (!pq.isEmpty()) {
System.out.println(pq.poll());
}
}
}