Java中通过Comparator实现PriorityQueue
先决条件:优先队列,比较器
Priority Queue 就像一个普通的队列,但是每个元素都有一个与之关联的“优先级”。在优先级队列中,优先级高的元素在优先级低的元素之前被服务。为此,它使用了一个比较函数,该函数强加了元素的总排序。
优先级队列的元素根据它们的自然顺序排序,或者由队列构建时提供的 Comparator 排序,具体取决于使用的构造函数
构造函数:
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。
- public PriorityQueue() :这将创建一个具有默认初始容量 (11) 的 PriorityQueue,它根据元素的自然顺序对其进行排序。
- public PriorityQueue(Collection c) :这将创建一个 PriorityQueue,其中包含指定 collection(c) 中的元素。如果指定的集合是 SortedSet 的实例,则此优先级队列将按照相同的顺序进行排序,否则此优先级队列将按照其元素的自然顺序进行排序。
- public PriorityQueue(int capacity, Comparator Comparator) :这将创建一个具有指定初始容量的 PriorityQueue,根据指定的比较器对其元素进行排序。
Parameters: capacity - the initial capacity for this priority queue comparator - the comparator that will be used to order this priority queue. If null, the natural ordering of the elements will be used.
- public PriorityQueue(SortedSet ss) :创建一个包含指定排序集中元素的 PriorityQueue。此优先级队列将根据与给定排序集相同的顺序进行排序。
提供的示例代码说明优先级高的学生(基于 cgpa)在低 cgpa 的学生之前得到服务。
// Java program to demonstrate working of
// comparator based priority queue constructor
import java.util.*;
public class Example {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
// Creating Priority queue constructor having
// initial capacity=5 and a StudentComparator instance
// as its parameters
PriorityQueue pq = new
PriorityQueue(5, new StudentComparator());
// Invoking a parameterized Student constructor with
// name and cgpa as the elements of queue
Student student1 = new Student("Nandini", 3.2);
// Adding a student object containing fields
// name and cgpa to priority queue
pq.add(student1);
Student student2 = new Student("Anmol", 3.6);
pq.add(student2);
Student student3 = new Student("Palak", 4.0);
pq.add(student3);
// Printing names of students in priority order,poll()
// method is used to access the head element of queue
System.out.println("Students served in their priority order");
while (!pq.isEmpty()) {
System.out.println(pq.poll().getName());
}
}
}
class StudentComparator implements Comparator{
// Overriding compare()method of Comparator
// for descending order of cgpa
public int compare(Student s1, Student s2) {
if (s1.cgpa < s2.cgpa)
return 1;
else if (s1.cgpa > s2.cgpa)
return -1;
return 0;
}
}
class Student {
public String name;
public double cgpa;
// A parameterized student constructor
public Student(String name, double cgpa) {
this.name = name;
this.cgpa = cgpa;
}
public String getName() {
return name;
}
}
输出:
Students served in their priority order
Palak
Anmol
Nandini
注意:这种类型的优先级队列在需要自定义排序的场景中是首选,即当需要不同的排序顺序时,可以定义自己的比较实例的方式。如果存在更复杂的比较算法,例如多个字段等,则可以实现比较器。