在Java集合框架中,PriorityQueue是一個基于優先級堆的無界優先級隊列。優先級隊列的元素按照其自然順序進行排序,或者根據構造隊列時提供的Comparator進行排序。優先級隊列不允許插入null元素,也不允許插入不可比較的對象。
PriorityQueue是一個無界隊列,意味著它可以動態增長以容納更多的元素。Comparator來實現自定義排序。PriorityQueue不是線程安全的,如果需要在多線程環境中使用,可以考慮使用java.util.concurrent.PriorityBlockingQueue。add(E e) / offer(E e):將指定的元素插入此優先級隊列。poll():獲取并移除此隊列的頭,如果隊列為空,則返回null。peek():獲取但不移除此隊列的頭,如果隊列為空,則返回null。remove(Object o):從隊列中移除指定的元素。size():返回隊列中的元素數量。clear():移除隊列中的所有元素。import java.util.PriorityQueue;
public class PriorityQueueExample {
public static void main(String[] args) {
// 創建一個自然順序的優先級隊列
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
// 添加元素
priorityQueue.add(10);
priorityQueue.add(30);
priorityQueue.add(20);
// 輸出隊列中的元素
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.poll());
}
}
}
輸出結果:
10
20
30
在這個例子中,PriorityQueue默認按照自然順序(從小到大)對元素進行排序,因此輸出的順序是10, 20, 30。
import java.util.Comparator;
import java.util.PriorityQueue;
public class CustomPriorityQueueExample {
public static void main(String[] args) {
// 創建一個自定義Comparator的優先級隊列
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Comparator.reverseOrder());
// 添加元素
priorityQueue.add(10);
priorityQueue.add(30);
priorityQueue.add(20);
// 輸出隊列中的元素
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.poll());
}
}
}
輸出結果:
30
20
10
在這個例子中,我們使用了Comparator.reverseOrder()來創建一個從大到小排序的優先級隊列,因此輸出的順序是30, 20, 10。
import java.util.PriorityQueue;
class Task implements Comparable<Task> {
private String name;
private int priority;
public Task(String name, int priority) {
this.name = name;
this.priority = priority;
}
@Override
public int compareTo(Task other) {
return Integer.compare(this.priority, other.priority);
}
@Override
public String toString() {
return name + " (Priority: " + priority + ")";
}
}
public class TaskPriorityQueueExample {
public static void main(String[] args) {
// 創建一個優先級隊列
PriorityQueue<Task> priorityQueue = new PriorityQueue<>();
// 添加任務
priorityQueue.add(new Task("Task 1", 3));
priorityQueue.add(new Task("Task 2", 1));
priorityQueue.add(new Task("Task 3", 2));
// 輸出隊列中的任務
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.poll());
}
}
}
輸出結果:
Task 2 (Priority: 1)
Task 3 (Priority: 2)
Task 1 (Priority: 3)
在這個例子中,我們定義了一個Task類,并實現了Comparable接口,使得任務可以根據優先級進行排序。優先級隊列按照任務的優先級從低到高進行排序,因此輸出的順序是Task 2, Task 3, Task 1。
PriorityQueue是Java集合框架中一個非常有用的數據結構,特別適用于需要按照優先級處理元素的場景。通過自然順序或自定義Comparator,我們可以靈活地控制隊列中元素的排序方式。在實際開發中,PriorityQueue常用于任務調度、事件處理等場景。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。