Java中的PriorityQueue完整指南

476 阅读3分钟

一个基于优先级堆的无界优先级队列。优先级队列的元素根据其自然排序或在队列构造时提供的Comparator ,这取决于使用哪个构造函数。一个优先级队列不允许有空元素。依靠自然排序的优先级队列也不允许插入不可比较的对象(这样做可能导致ClassCastException)。

我们之前已经了解了**队列**的情况。现在,如果我们想让队列里面的元素根据其优先级被处理,那么我们就使用PriorityQueue的概念。

我们已经看到Queue一般是按照FIFO(先进先出)的原则工作的,但是当Queue需要按照某种优先级进行处理时,它是基于一个优先级堆的。

现在,PriorityQueue的要点是,PriorityQueue的元素以自然排序或在队列构造时使用构造函数提供的比较器来排序。

Java中的PriorityQueue

Java中的优先级 队列是一种特殊的队列类型,其中所有的元素都是按照其自然排序或根据创建时提供的自定义比较器进行排序

要记住优先级队列的一些有用要点:

  1. 它不允许出现NULL
  2. 它是一个无界的队列
  3. PriorityQueue的前面包含了根据特定排序的最少的元素,而优先级队列的后面包含了最重要的元素。

PriorityQueue in Java

4.它继承了 AbstractQueueAbstractCollectionCollectionObject 类的 方法 。

Java PriorityQueue Example

优先级队列的构造函数

现在我们来了解一下PriorityQueue的一些构造函数

  1. PriorityQueue():这个构造函数,是一个初始容量为11的PriorityQueue,其排序是按自然顺序进行的。
  2. PriorityQueue(int initial capacity):它以指定的初始容量创建一个PriorityQueue,排序将是自然排序。
  3. PriorityQueue(PriorityQueue pq):它创建一个包含另一个特定PriorityQueue的元素的PriorityQueue。
  4. PriorityQueue(SortedSet ss):它在指定的排序集的元素的帮助下创建PriorityQueue。
  5. PriorityQueue(Collection c):它在特定集合的元素的帮助下创建优先队列。
  6. 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);
	}
}

请看下面的输出:

Add

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 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 remove()

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);
	}
}

请看下面的输出:

POLL() method in Java

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());
	}
}

见下面的输出:

int 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]);
		}
		
	}
}

请看下面的例子:

toArray() method

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);
	}
}

请看下面的输出:

void clear()

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);
	}
}

请看下面的输出:

add() method

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"));
	}
}

见下面的输出:

boolean contains()

迭代器 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());
		}
	}
}

见下面的输出:

Iterator iterator()

比较器 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 + " ");
	}
}

请看下面的输出:

Comparator comparator()

本教程就到此为止。