java 中 priorityqueue的使用
java.util
類 PriorityQueue<E>
- 型別引數:
E
- collection 中所儲存元素的型別。
public class PriorityQueue<E>extends AbstractQueue<E>implements Serializable
一個基於優先順序堆的無界優先順序佇列。優先順序佇列的元素按照其自然順序進行排序,或者根據構造佇列時提供的 Comparator
進行排序,具體取決於所使用的構造方法。優先順序佇列不允許使用 null
元素。依靠自然順序的優先順序佇列還不允許插入不可比較的物件(這樣做可能導致 ClassCastException
此佇列的頭 是按指定排序方式確定的最小 元素。如果多個元素都是最小值,則頭是其中一個元素——選擇方法是任意的。佇列獲取操作 poll
、remove
、peek
和 element
訪問處於佇列頭的元素。
優先順序佇列是無界的,但是有一個內部容量,控制著用於儲存佇列元素的陣列大小。它通常至少等於佇列的大小。隨著不斷向優先順序佇列新增元素,其容量會自動增加。無需指定容量增加策略的細節。
此類及其迭代器實現了 Collection
和 Iterator
介面的所有可選 方法。方法 iterator()
中提供的迭代器不 保證以任何特定的順序遍歷優先順序佇列中的元素。如果需要按順序遍歷,請考慮使用 Arrays.sort(pq.toArray())
注意,此實現不是同步的。如果多個執行緒中的任意執行緒修改了佇列,則這些執行緒不應同時訪問 PriorityQueue
例項。相反,請使用執行緒安全的 PriorityBlockingQueue
類。
實現注意事項:此實現為排隊和出隊方法(offer
、poll
、remove()
和 add
)提供 O(log(n)) 時間;為 remove(Object)
和 contains(Object)
方法提供線性時間;為獲取方法(peek
、element
和 size
)提供固定時間。
- 從以下版本開始:
- 1.5
- 另請參見:
- 序列化表格
構造方法摘要 | |
---|---|
使用預設的初始容量(11)建立一個 PriorityQueue | |
建立包含指定 collection 中元素的 PriorityQueue 。 | |
(int initialCapacity) 使用指定的初始容量建立一個 PriorityQueue ,並根據其自然順序對元素進行排序。 | |
(int initialCapacity, Comparator<? super E> comparator) 使用指定的初始容量建立一個 PriorityQueue ,並根據指定的比較器對元素進行排序。 | |
建立包含指定優先順序佇列元素的 PriorityQueue 。 | |
建立包含指定有序 set 元素的 PriorityQueue 。 |
方法摘要 | ||
---|---|---|
boolean | add(E e) 將指定的元素插入此優先順序佇列。 | |
void | clear() 從此優先順序佇列中移除所有元素。 | |
返回用來對此佇列中的元素進行排序的比較器;如果此佇列根據其元素的自然順序進行排序,則返回 null 。 | ||
boolean | 如果此佇列包含指定的元素,則返回 true 。 | |
返回在此佇列中的元素上進行迭代的迭代器。 | ||
boolean | offer(E e) 將指定的元素插入此優先順序佇列。 | |
E | peek() 獲取但不移除此佇列的頭;如果此佇列為空,則返回 null。 | |
E | poll() 獲取並移除此佇列的頭,如果此佇列為空,則返回 null。 | |
boolean | 從此佇列中移除指定元素的單個例項(如果存在)。 | |
int | size() 返回此 collection 中的元素數。 | |
返回一個包含此佇列所有元素的陣列。 | ||
| 返回一個包含此佇列所有元素的陣列;返回陣列的執行時型別是指定陣列的型別。 |
構造方法詳細資訊 |
---|
PriorityQueue
public PriorityQueue()
- 使用預設的初始容量(11)建立一個
PriorityQueue
,並根據其自然順序對元素進行排序。
PriorityQueue
public PriorityQueue(int initialCapacity)
- 使用指定的初始容量建立一個
PriorityQueue
,並根據其自然順序對元素進行排序。- 引數:
initialCapacity
- 此優先順序佇列的初始容量- 丟擲:
PriorityQueue
public PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
- 使用指定的初始容量建立一個
PriorityQueue
,並根據指定的比較器對元素進行排序。- 引數:
initialCapacity
- 此優先順序佇列的初始容量comparator
- 用於對此優先順序佇列進行排序的比較器。如果該引數為null
,則將使用元素的自然順序- 丟擲:
PriorityQueue
public PriorityQueue(Collection<? extends E> c)
- 建立包含指定 collection 中元素的
PriorityQueue
。如果指定的 collection 是SortedSet
的一個例項或者是另一個PriorityQueue
,那麼此優先順序佇列將根據相同順序進行排序。否則,此優先順序佇列將根據元素的自然順序進行排序。- 引數:
c
- collection,其元素要置於此優先順序佇列中- 丟擲:
- - 如果根據優先順序佇列的排序規則無法比較指定 collection 中的各個元素
PriorityQueue
public PriorityQueue(PriorityQueue<? extends E> c)
- 建立包含指定優先順序佇列元素的
PriorityQueue
。此優先順序佇列將根據與給定優先順序佇列相同的順序進行排序。- 引數:
c
- 優先順序佇列,其元素要置於此優先順序佇列中- 丟擲:
PriorityQueue
public PriorityQueue(SortedSet<? extends E> c)
- 建立包含指定有序 set 元素的
PriorityQueue
。此優先順序佇列將根據與給定有序 set 相同的順序進行排序。- 引數:
c
- 有序 set,其元素將置於此優先順序佇列中- 丟擲:
- - 如果根據有序 set 的順序無法比較該有序 set 中的各個元素
方法詳細資訊 |
---|
add
public boolean add(E e)
offer
public boolean offer(E e)
- 將指定的元素插入此優先順序佇列。
- 引數:
e
- 要新增的元素- 返回:
- 丟擲:
- - 如果根據優先順序佇列的順序無法將指定元素與此優先順序佇列中當前元素進行比較
peek
public E peek()
remove
public boolean remove(Object o)
- 從此佇列中移除指定元素的單個例項(如果存在)。更確切地講,如果此佇列包含一個或多個滿足
o.equals(e)
的元素e
,則移除一個這樣的元素。當且僅當此佇列包含指定的元素(或者此佇列由於呼叫而發生更改),則返回true
。 - 引數:
o
- 要從此佇列中移除的元素(如果存在)- 返回:
- 如果此佇列由於呼叫而發生更改,則返回
true
contains
public boolean contains(Object o)
- 如果此佇列包含指定的元素,則返回
true
。更確切地講,當且僅當此佇列至少包含一個滿足o.equals(e)
的元素e
時,才返回true
。 - 引數:
o
- 要檢查是否包含於此佇列的物件- 返回:
- 如果此佇列包含指定元素,則返回
true
toArray
public Object[] toArray()
- 返回一個包含此佇列所有元素的陣列。陣列元素沒有特定的順序。
由於此佇列並不維護對返回陣列的任何引用,因而它將是“安全的”。(換句話說,此方法必須分配一個新陣列)。因此,呼叫者可以隨意修改返回的陣列。
此方法充當基於陣列的 API 與基於 collection 的 API 之間的橋樑。
- 返回:
- 包含此佇列所有元素的陣列
toArray
public <T> T[] toArray(T[] a)
- 返回一個包含此佇列所有元素的陣列;返回陣列的執行時型別是指定陣列的型別。返回陣列的元素沒有特定的順序。如果指定的陣列能容納佇列,則將該佇列返回此處。否則,將根據指定陣列的執行時型別和此佇列的大小分配一個新陣列。
如果指定陣列能容納佇列,且有剩餘空間(即陣列比佇列元素多),則緊跟在 collection 末尾的陣列元素將被設定為
null
。像
toArray()
方法一樣,此方法充當基於陣列 的 API 與基於 collection 的 API 之間的橋樑。進一步說,此方法允許對輸出陣列的執行時型別進行精確控制,在某些情況下,可以用來節省分配開銷。假定 x 是隻包含字串的一個已知佇列。以下程式碼可以用來將該佇列轉儲到一個新分配的 String 陣列:
String[] y = x.toArray(new String[0]);
注意,toArray(new Object[0]) 和 toArray() 在功能上是相同的。 - 引數:
a
- 儲存此佇列元素的陣列(如果該陣列足夠大);否則,將為此分配一個具有相同執行時型別的新陣列。- 返回:
- 包含此佇列所有元素的陣列
- 丟擲:
如果指定陣列的執行時型別不是此佇列每個元素的執行時型別的子型別
iterator
public Iterator<E> iterator()
size
public int size()
- 返回此 collection 中的元素數。如果此 collection 包含的元素大於 Integer.MAX_VALUE,則返回 Integer.MAX_VALUE。
- 返回:
- 此 collection 中的元素數
clear
public void clear()
- 從此優先順序佇列中移除所有元素。此呼叫返回後佇列為空。
poll
public E poll()
comparator
public Comparator<? super E> comparator()
- 返回用來對此佇列中的元素進行排序的比較器;如果此佇列根據其元素的自然順序進行排序,則返回
null
。 - 返回:
- 用於對此佇列進行排序的比較器;如果此佇列根據其元素的自然順序進行排序,則返回
null