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. 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