一个基于优先级堆的无界优先级队列。优先级队列的元素根据其自然排序或在队列构造时提供的Comparator
,这取决于使用哪个构造函数。一个优先级队列不允许有空元素。依靠自然排序的优先级队列也不允许插入不可比较的对象(这样做可能导致ClassCastException)。
我们之前已经了解了**队列**的情况。现在,如果我们想让队列里面的元素根据其优先级被处理,那么我们就使用PriorityQueue的概念。
我们已经看到Queue一般是按照FIFO(先进先出)的原则工作的,但是当Queue需要按照某种优先级进行处理时,它是基于一个优先级堆的。
现在,PriorityQueue的要点是,PriorityQueue的元素以自然排序或在队列构造时使用构造函数提供的比较器来排序。
Java中的PriorityQueue
Java中的优先级 队列是一种特殊的队列类型,其中所有的元素都是按照其自然排序或根据创建时提供的自定义比较器进行排序。
要记住优先级队列的一些有用要点:
- 它不允许出现NULL值
- 它是一个无界的队列
- PriorityQueue的前面包含了根据特定排序的最少的元素,而优先级队列的后面包含了最重要的元素。
4.它继承了 AbstractQueue、 AbstractCollection、 Collection 和 Object 类的 方法 。
优先级队列的构造函数
现在我们来了解一下PriorityQueue的一些构造函数:
- PriorityQueue():这个构造函数,是一个初始容量为11的PriorityQueue,其排序是按自然顺序进行的。
- PriorityQueue(int initial capacity):它以指定的初始容量创建一个PriorityQueue,排序将是自然排序。
- PriorityQueue(PriorityQueue pq):它创建一个包含另一个特定PriorityQueue的元素的PriorityQueue。
- PriorityQueue(SortedSet ss):它在指定的排序集的元素的帮助下创建PriorityQueue。
- PriorityQueue(Collection c):它在特定集合的元素的帮助下创建优先队列。
- PriorityQueue(int initial capacity, Comparator comp):它以特定的初始能力创建PriorityQueue,并根据指定的比较器来确定其元素的顺序。
PriorityQueue中的方法
现在让我们来谈谈PriorityQueue类的各种方法。
boolean add (element)
在add()方法的帮助下,我们把元素插入到优先级队列中。例如,请看下面的文件Add.java:
//importing PriorityQueue from util package
import java.util.PriorityQueue;
class Add
{
public static void main(String []er)
{
//creating a priority queue
PriorityQueue<String> pq= new PriorityQueue<>();
//adding elements to the queue
pq.add("C");
pq.add("C++");
pq.add("Java");
pq.add("HTML");
//adding element to the queue with the help of offer() method
pq.offer("CSS");
//showing elements of queue
System.out.println("Elements of PriorityQueue are: "+pq);
}
}
请看下面的输出:
public peek()
这个方法检索(而不是删除)优先级队列的头部元素;如果优先级队列中没有元素存在,它也会返回NULL。请看下面的例子:
// Peek.java
//importing PriorityQueue from util package
import java.util.PriorityQueue;
class Peek
{
public static void main(String []er)
{
//creating a priority queue
PriorityQueue<String> pq= new PriorityQueue<>();
//adding elements to the queue
pq.add("C");
pq.add("C++");
pq.add("Java");
pq.add("HTML");
pq.add("CSS");
//showing elements of queue
System.out.println("Elements of PriorityQueue are: "+pq);
// showing the head of the priority queue using peek() method
System.out.println("Head element of the queue is :"+pq.peek());
}
}
请看下面的输出:
public remove()
remove()方法从优先级队列中删除一个指定的元素。请看下面的代码:
// Remove.java
//importing PriorityQueue from util package
import java.util.PriorityQueue;
class Remove
{
public static void main(String []er)
{
//creating a priority queue
PriorityQueue<String> pq= new PriorityQueue<>();
//adding elements to the queue
pq.add("C");
pq.add("C++");
pq.add("Java");
pq.add("HTML");
pq.add("CSS");
//showing elements of queue
System.out.println("Elements of PriorityQueue are: "+pq);
// removing all elements of the queue using clear() method
pq.remove();
System.out.println("After using remove() method elements in the queue :"+pq);
}
}
见下面的输出:
public poll()
它删除并检索一个优先级队列的头部元素。请看下面的代码:
// Poll.java
//importing PriorityQueue from util package
import java.util.PriorityQueue;
class Poll
{
public static void main(String []er)
{
//creating a priority queue
PriorityQueue<String> pq= new PriorityQueue<>();
//adding elements to the queue
pq.add("C");
pq.add("C++");
pq.add("Java");
pq.add("HTML");
pq.add("CSS");
//showing elements of queue
System.out.println("Elements of PriorityQueue are: "+pq);
// removing the head of the priority queue using poll() method
pq.poll();
System.out.println("Head element of the queue is :"+pq);
}
}
请看下面的输出:
int size()
int size()方法返回优先级队列中的几个元素:
// Size.java
//importing PriorityQueue from util package
import java.util.PriorityQueue;
class Size
{
public static void main(String []er)
{
//creating a priority queue
PriorityQueue<String> pq= new PriorityQueue<>();
//adding elements to the queue
pq.add("C");
pq.add("C++");
pq.add("Java");
pq.add("HTML");
pq.add("CSS");
//showing elements of queue
System.out.println("Elements of PriorityQueue are: "+pq);
//calculating size
System.out.println("Size of the PriorityQueue is "+pq.size());
}
}
见下面的输出:
toArray()
toArray()函数用于返回包含优先级队列中所有元素的数组。
请看下面的代码:
//importing PriorityQueue from util package
import java.util.PriorityQueue;
class ToArray
{
public static void main(String []er)
{
//creating a priority queue
PriorityQueue<String> pq= new PriorityQueue<>();
//adding elements to the queue
pq.add("C");
pq.add("C++");
pq.add("Java");
pq.add("HTML");
pq.add("CSS");
//showing elements of queue
System.out.println("Elements of PriorityQueue are: "+pq);
//declaring an array
String[] arr =new String[10];
//returning the elements to the array using toArray() method
String [] arr1=pq.toArray(arr);
System.out.println("Elements in the array:");
for(int i=0;i<pq.size();i++)
{
System.out.println(arr[i]);
}
}
}
请看下面的例子:
void clear()
clear()方法将优先级队列中的所有项目删除:
// Clear.java
//importing PriorityQueue from util package
import java.util.PriorityQueue;
class Clear
{
public static void main(String []er)
{
//creating a priority queue
PriorityQueue<String> pq= new PriorityQueue<>();
//adding elements to the queue
pq.add("C");
pq.add("C++");
pq.add("Java");
pq.add("HTML");
pq.add("CSS");
//showing elements of queue
System.out.println("Elements of PriorityQueue are: "+pq);
// removing all elements of the queue using clear() method
pq.clear();
System.out.println("After using clear() method elements in the queue :"+pq);
}
}
请看下面的输出:
boolean offer(element)
这个方法用来将一个指定的元素插入到优先级队列中:
//importing PriorityQueue from util package
import java.util.PriorityQueue;
class Add
{
public static void main(String []er)
{
//creating a priority queue
PriorityQueue<String> pq= new PriorityQueue<>();
//adding elements to the queue
pq.add("C");
pq.add("C++");
pq.add("Java");
pq.add("HTML");
//adding element to the queue with the help of offer() method
pq.offer("CSS");
//showing elements of queue
System.out.println("Elements of PriorityQueue are: "+pq);
}
}
请看下面的输出:
boolean contains (Object element)
如果优先级队列包含一个特定的项目,布尔()方法返回真。
见下面的程序:
// Contains.java
//importing PriorityQueue from util package
import java.util.PriorityQueue;
class Contains
{
public static void main(String []er)
{
//creating a priority queue
PriorityQueue<String> pq= new PriorityQueue<>();
//adding elements to the queue
pq.add("C");
pq.add("C++");
pq.add("Java");
pq.add("HTML");
pq.add("CSS");
//showing elements of queue
System.out.println("Elements of PriorityQueue are: "+pq);
// checking specific element presents or not in the queue using contains method
System.out.println("Is 'C++' present? "+pq.contains("C++"));
System.out.println("Is 'Python' present? "+pq.contains("Python"));
}
}
见下面的输出:
迭代器 iterator()
该 iterator()方法 返回该队列中的元素的迭代器。请看下面的代码:
// IteratorDemo.java
//importing PriorityQueue from util package
import java.util.PriorityQueue;
import java.util.Iterator;
class IteratorDemo
{
public static void main(String []er)
{
//creating a priority queue
PriorityQueue<String> pq= new PriorityQueue<>();
//adding elements to the queue
pq.add("C");
pq.add("C++");
pq.add("Java");
pq.add("HTML");
pq.add("CSS");
//showing elements of queue
System.out.println("Elements of PriorityQueue are: "+pq);
//creating an iterator
Iterator iq=pq.iterator();
//dispalying values with the help of iterator
System.out.println("The iterator values are:");
while(iq.hasNext())
{
System.out.println(iq.next());
}
}
}
见下面的输出:
比较器 comparator()
该方法用于返回比较器,它可以用来对优先级队列元素进行排序。请看下面的代码:
// Comparator.java
import java.util.Comparator;
import java.util.PriorityQueue;
class DemoComp implements Comparator<String>
{
public int compare(String str1, String str2)
{
String str11;
String str12;
str11 = str1;
str12 = str2;
return str12.compareTo(str11);
}
}
class ComparatorDemo
{
public static void main(String[] er)
{
PriorityQueue<String> q = new PriorityQueue<String>(new DemoComp());
q.add("C");
q.add("C++");
q.add("Java");
q.add("HTML");
q.add("CSS");
System.out.println("Queue before using the comparator() method: " + q);
System.out.println("Queue after using comparator() method");
for (String i : q)
System.out.print(i + " ");
}
}
请看下面的输出:
本教程就到此为止。