PriorityQueue
翻譯過來就是優先隊列,本質是一個堆, 默認情況下堆頂每次都保留最小值,每插入一個元素,仍動態維護堆頂為最小值。
PriorityQueue 一個基於優先級的無界優先級隊列。優先級隊列的元素按照其自然順序進行排序,或者根據構造隊列時提供的 Comparator 進行排序,具體取決於所使用的構造方法。該隊列不允許使用 null 元素也不允許插入不可比較的對象(沒有實現Comparable接口的對象)。
PriorityQueue 隊列的頭指排序規則最小那個元素。如果多個元素都是最小值則隨機選一個。
PriorityQueue 是一個無界隊列,但是初始的容量(實際是一個Object[]),隨着不斷向優先級隊列添加元素,其容量會自動擴容,無需指定容量增加策略的細節。
初始化
PriorityQueue()
//使用默認的初始容量(11)創建一個 PriorityQueue,並根據其自然順序對元素進行排序。
PriorityQueue<Integer> Q = new PriorityQueue<>(); // 初始化
常用函數
add(E e)
//將指定的元素插入此優先級隊列。
clear()
//清空
contains(Object o)
// 如果包含指定元素返回true
iterator()
//返回在此隊列中的元素上進行迭代的迭代器。
offer(E e)
// 將指定元素插入此優先隊列
peek()
// 獲取第一個元素,及最小或最大元素
poll()
// 獲取並移除第一個
remove(Object o)
// 移除指定元素
size()
// 返回元素個數
基本使用
public class Main {
public static void main(String[] args) {
PriorityQueue<String> q = new PriorityQueue<>();
//入列
q.offer("1");
q.offer("2");
q.offer("5");
q.offer("3");
q.offer("4");
//出列
System.out.println(q.poll()); //1
System.out.println(q.poll()); //2
System.out.println(q.poll()); //3
System.out.println(q.poll()); //4
System.out.println(q.poll()); //5
}
}
PriorityQueue使用跟普通隊列一樣,唯一區別是PriorityQueue會根據排序規則決定誰在隊頭,誰在隊尾。
實現大根堆的兩種方式
- 使用自定義比較器Comparator
- 將所有數據變為之前自身的負數之后在插入, 因為添加個負號就相當於是逆序了嘛。1 < 2 < 3 取負之后變為 -1 > - 2 > - 3
實例
public static void main(String[] args){
Scanner in = new Scanner(new InputStreamReader(System.in));
PriorityQueue<Integer> Q = new PriorityQueue<>();
int a;
for(int i = 0; i < 10; i++){
a = in.nextInt();
Q.add(a);
System.out.print(Q.peek()+" ");// 輸出當前隊列的最小元素
}
}
輸入: 1 -1 -2 -3 10 -4 -5 -6 -7 -8
輸出: 1 -1 -2 -3 -3 -4 -5 -6 -7 -8