Java PriorityQueue 類別:初學者指南

介紹

你好,未來的 Java 程式設計師!今天,我們將要深入 Java 中 PriorityQueue 的奇妙世界。如果你從未聽說過它,別擔心——我們將從頭開始,一起逐步學習。將 PriorityQueue 視為一種特殊的行列(或隊列),在這裡最重要的人(或項目)總是能夠首先獲得服務。很刺激對吧?讓我們開始吧!

Java - PriorityQueue

類別聲明

在 Java 中,PriorityQueue 類別是 Java 集合框架的一部分。它就像是你數據的 VIP 名單!以下是聲明方式:

import java.util.PriorityQueue;

PriorityQueue<ElementType> pq = new PriorityQueue<>();

ElementType 替換為你想要儲存的任何數據類型,例如 Integer、String 或甚至是你的自定義物件(但我們稍後會提到這部分)。

參數

在創建 PriorityQueue 時,你可以指定一些可選參數:

  1. 初始容量:它最初可以容納多少個項目。
  2. 比較器:一個特殊的物件,用來決定元素的順序。

以下是一個例子:

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