Java中PriorityQueue的排序
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/huanghanqian/article/details/73433760
PrioriryQueue是Queue介面的一個佇列實現類,但它的排序並不是典型的佇列式先進先出(FIFO)的方式。
PriorityQueue的排序方式分為兩種,一種是自然排序,這是按照加入元素的大小從小到大排序的。第二種是定製排序,是使用comparator類來重寫compare(Object o1,Object o2)方法來實現定製排序的。但是這些都不是關鍵,關鍵在於PriorityQueue的排序不是普通的排序,而是堆排序,這有什麼不同呢?來看下面一段程式碼:
import java.util.PriorityQueue; public class PriorityQueueTest3 { public static void main(String[] args) { PriorityQueue pq = new PriorityQueue(); pq.offer(6); pq.offer(-3); pq.offer(0); pq.offer(9); System.out.println(pq); } }
輸出結果:[-3,6,0,9]
不是說是按從小到大來排序的嗎?怎麼沒排序?
原因是堆排序只會保證第一個元素也就是根節點的元素是當前優先佇列裡最小(或者最大)的元素,而且每一次變化之後,比如offer()或者poll()之後,都會進行堆重排,所以如果想要按從小到大的順序取出元素,那麼需要用一個for迴圈,如下:
import java.util.PriorityQueue; public class PriorityQueueTest3 { public static void main(String[] args) { PriorityQueue pq = new PriorityQueue(); pq.offer(6); pq.offer(-3); pq.offer(0); pq.offer(9); int len = pq.size();//這裡之所以取出.size()大小,因為每一次poll()之後size大小都會變化,所以不能作為for迴圈的判斷條件 for(int i=0;i<len;i++){ System.out.print(pq.poll()+" "); } System.out.println(); } }
輸出 -3 0 6 9,按照從小到大的順序輸出的
Constructor Detail
-
PriorityQueue
public PriorityQueue()
Creates a
PriorityQueue
with the default initial capacity (11) that orders its elements according to their natural ordering.
-
PriorityQueue
public PriorityQueue(int initialCapacity)
Creates a
PriorityQueue
with the specified initial capacity that orders its elements according to their natural ordering.Parameters:
initialCapacity
- the initial capacity for this priority queueThrows:
-
PriorityQueue
public PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
Creates a
PriorityQueue
with the specified initial capacity that orders its elements according to the specified comparator.Parameters:
initialCapacity
- the initial capacity for this priority queuecomparator
- the comparator that will be used to order this priority queue. Ifnull
, the natural ordering of the elements will be used.Throws: