Java PriorityQueue 類別:初學者指南
介紹
你好,未來的 Java 程式設計師!今天,我們將要深入 Java 中 PriorityQueue 的奇妙世界。如果你從未聽說過它,別擔心——我們將從頭開始,一起逐步學習。將 PriorityQueue 視為一種特殊的行列(或隊列),在這裡最重要的人(或項目)總是能夠首先獲得服務。很刺激對吧?讓我們開始吧!
類別聲明
在 Java 中,PriorityQueue 類別是 Java 集合框架的一部分。它就像是你數據的 VIP 名單!以下是聲明方式:
import java.util.PriorityQueue;
PriorityQueue<ElementType> pq = new PriorityQueue<>();
將 ElementType
替換為你想要儲存的任何數據類型,例如 Integer、String 或甚至是你的自定義物件(但我們稍後會提到這部分)。
參數
在創建 PriorityQueue 時,你可以指定一些可選參數:
- 初始容量:它最初可以容納多少個項目。
- 比較器:一個特殊的物件,用來決定元素的順序。
以下是一個例子:
PriorityQueue<Integer> pq = new PriorityQueue<>(10, Collections.reverseOrder());
這會創建一個初始容量為 10 的 PriorityQueue,且其中的整數將按照從高到低的順序排列。
類別構造器
PriorityQueue 提供了多個構造器。將構造器視為創建隊列的不同配方。以下是一些主要的構造器:
構造器 | 描述 |
---|---|
PriorityQueue() |
創建一個空的隊列,具有預設的初始容量(11) |
PriorityQueue(int initialCapacity) |
創建一個空的隊列,具有指定的初始容量 |
PriorityQueue(Comparator<? super E> comparator) |
創建一個空的隊列,具有指定的比較器 |
PriorityQueue(Collection<? extends E> c) |
創建一個包含指定集合中元素的隊列 |
讓我們看一個例子:
PriorityQueue<String> fruitQueue = new PriorityQueue<>();
PriorityQueue<Integer> numberQueue = new PriorityQueue<>(20);
在第一行中,我們創建了一個字符串的隊列(可能是水果名稱?)。在第二行,我們創建了一個可以初始容納 20 個項目的數字隊列。
類別方法
現在,讓我們看看你可以在 PriorityQueue 上進行的一些酷炫操作:
方法 | 描述 |
---|---|
add(E e) |
將元素添加到隊列中 |
offer(E e) |
將元素添加到隊列中(如果已滿則返回 false) |
peek() |
檢索但不移除隊列的頭部 |
poll() |
檢索並移除隊列的頭部 |
remove(Object o) |
移除指定元素的一個實例 |
size() |
返回隊列中的元素數量 |
clear() |
從隊列中移除所有元素 |
讓我們看看這些方法如何運作:
PriorityQueue<String> animalQueue = new PriorityQueue<>();
animalQueue.add("Dog");
animalQueue.offer("Cat");
animalQueue.add("Elephant");
System.out.println("Peek: " + animalQueue.peek()); // 輸出:Peek: Cat
System.out.println("Poll: " + animalQueue.poll()); // 輸出:Poll: Cat
System.out.println("Size: " + animalQueue.size()); // 輸出:Size: 2
注意到“Cat”是如何首先出現的嗎?這是因為 PriorityQueue 預設會按字母順序對字符串進行排序。
繼承的方法
PriorityQueue 還從其父類繼承了方法。這就像獲得了額外的功能!一些有用的包括:
-
contains(Object o)
: 檢查隊列是否包含指定的元素 -
toArray()
: 返回一個包含隊列中所有元素的數組 -
iterator()
: 返回對隊列元素進行迭代的迭代器
以下是一個簡單的例子:
PriorityQueue<Integer> numberQueue = new PriorityQueue<>();
numberQueue.add(5);
numberQueue.add(2);
numberQueue.add(8);
System.out.println("Contains 2? " + numberQueue.contains(2)); // 輸出:Contains 2? true
Object[] array = numberQueue.toArray();
System.out.println("First element: " + array[0]); // 輸出:First element: 2
將項目添加到優先隊列的例子
讓我們通過一個有趣的例子將所有這些知識串聯起來。假設我們正在組織一場派對,並希望按照嘉賓的到達時間來迎接他們:
import java.util.PriorityQueue;
public class PartyGreeter {
public static void main(String[] args) {
PriorityQueue<Guest> guestQueue = new PriorityQueue<>();
guestQueue.add(new Guest("Alice", 18.30));
guestQueue.add(new Guest("Bob", 18.15));
guestQueue.add(new Guest("Charlie", 18.45));
while (!guestQueue.isEmpty()) {
Guest guest = guestQueue.poll();
System.out.println("Welcome, " + guest.name + "! You arrived at " + guest.arrivalTime);
}
}
static class Guest implements Comparable<Guest> {
String name;
double arrivalTime;
Guest(String name, double arrivalTime) {
this.name = name;
this.arrivalTime = arrivalTime;
}
@Override
public int compareTo(Guest other) {
return Double.compare(this.arrivalTime, other.arrivalTime);
}
}
}
此程式將輸出:
Welcome, Bob! You arrived at 18.15
Welcome, Alice! You arrived at 18.3
Welcome, Charlie! You arrived at 18.45
在這個例子中,我們創建了一個自定義的 Guest
類別,並告訴 Java 如何根據嘉賓的到達時間進行比較。PriorityQueue 然後自動為我們排序嘉賓!
就是這樣!你剛剛走出了 Java 中 PriorityQueue 世界 的第一步。記住,熟練需要練習,所以不要害怕實驗這些概念。誰知道呢?也許你會使用 PriorityQueue 來組織你下一場派對的嘉賓名單!
Credits: Image by storyset