Java PriorityQueue 类:初学者指南
引言
大家好,未来的 Java 程序员们!今天,我们将深入探讨 Java 中的 PriorityQueue。如果你之前从未听说过它,别担心——我们将从零开始,一起逐步学习。你可以将 PriorityQueue 视为一种特殊的队列(或排队的队列),在这里,最重要的人(或项目)总是能够优先。是不是很激动?让我们开始吧!
类声明
在 Java 中,PriorityQueue 类是 Java 集合框架的一部分。它就像是你数据的 VIP 名单!以下是它的声明方式:
import java.util.PriorityQueue;
PriorityQueue<ElementType> pq = new PriorityQueue<>();
将 ElementType
替换为你想要存储的数据类型,比如 Integer、String,甚至是自定义的对象(我们稍后会讨论)。
参数
创建 PriorityQueue 时,你可以指定一些可选参数:
- 初始容量:它最初可以容纳多少个项目。
- Comparator:一个特殊的对象,用于决定元素的顺序。
以下是一个例子:
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