📜  Java中通过Comparator实现PriorityQueue

📅  最后修改于: 2022-05-13 01:57:00.928000             🧑  作者: Mango

Java中通过Comparator实现PriorityQueue

先决条件:优先队列,比较器
Priority Queue 就像一个普通的队列,但是每个元素都有一个与之关联的“优先级”。在优先级队列中,优先级高的元素在优先级低的元素之前被服务。为此,它使用了一个比较函数,该函数强加了元素的总排序。

优先级队列的元素根据它们的自然顺序排序,或者由队列构建时提供的 Comparator 排序,具体取决于使用的构造函数

构造函数:

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。

  1. public PriorityQueue() :这将创建一个具有默认初始容量 (11) 的 PriorityQueue,它根据元素的自然顺序对其进行排序。
  2. public PriorityQueue(Collection c) :这将创建一个 PriorityQueue,其中包含指定 collection(c) 中的元素。如果指定的集合是 SortedSet 的实例,则此优先级队列将按照相同的顺序进行排序,否则此优先级队列将按照其元素的自然顺序进行排序。
  3. 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.
    
  4. 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

注意:这种类型的优先级队列在需要自定义排序的场景中是首选,即当需要不同的排序顺序时,可以定义自己的比较实例的方式。如果存在更复杂的比较算法,例如多个字段等,则可以实现比较器。