本文深入剖析了Java中的PriorityQueue类及其工作机制,并通过具体示例展示其应用,帮助读者理解如何在实际编程中有效使用优先队列。
Java 的优先队列 PriorityQueue 原理及实例分析
在 Java 中,PriorityQueue 是 Queue 接口的一种实现方式,它能够存储并排序元素。它可以容纳基本数据类型的包装类(如 Integer 和 Long)或自定义的类作为其元素。默认情况下,PriorityQueue 里的元素按升序排列;然而对于用户自定义的类型,则需要提供一个比较器。
一、优先队列概述
-----------------
PriorityQueue 是 Java 中的一种特殊的数据结构,用于存储和排序元素。它实现了 Queue 接口,并提供了诸如添加、删除及检查是否为空等基本操作。可以将基本数据类型的包装类或用户自定义的类型作为 PriorityQueue 的元素进行处理。
二、常用方法
--------------
- `peek()`:返回队列中的第一个(优先级最高的)元素,但不将其移出队列。
- `poll()`:获取并删除队首(最高优先级)的元素。
- `add(E e)`:将指定的元素添加到此优先队列中。
- `size()`:返回该 PriorityQueue 中包含的元素数量。
- `isEmpty()`:如果此队列不包含任何元素,则返回 true;否则,返回 false。
三、使用实例
---------------
### 1. 基本数据类型包装类的应用示例:
可以利用 PriorityQueue 存储如 Integer 和 Long 类型的数据。默认情况下,这些元素将按照升序排列,但也可以通过自定义比较器来改变这一规则。
```java
static Comparator cmp = new Comparator() {
public int compare(Integer e1, Integer e2) {
return e2 - e1;
}
};
public static void main(String[] args) {
Queue q = new PriorityQueue<>(cmp);
q.add(3);
q.add(2);
q.add(4);
while (!q.isEmpty()) {
System.out.print(q.poll() + );
}
}
```
### 2. 自定义类的应用示例:
同样,也可以使用 PriorityQueue 来处理自定义的类。在这种情况下,需要提供一个比较器来确定如何排序这些元素。
```java
class Node {
public Node(int chang, int kuan) {
this.chang = chang;
this.kuan = kuan;
}
int chang;
int kuan;
}
public class Test {
static Comparator cNode = new Comparator() {
public int compare(Node o1, Node o2) {
if (o1.chang != o2.chang)
return o1.chang - o2.chang;
else
return o2.kuan - o1.kuan;
}
};
public static void main(String[] args) {
Queue q = new PriorityQueue<>(cNode);
Node n1 = new Node(1, 2);
Node n2 = new Node(2, 5);
Node n3 = new Node(2, 3);
q.add(n1);
q.add(n2);
q.add(n3);
while (!q.isEmpty()) {
System.out.println(长: + q.poll().chang + 宽: + q.poll().kuan);
}
}
}
```
### 3. 遍历优先队列:
PriorityQueue 的迭代器不保证以任何特定顺序遍历元素。如果需要按特定顺序访问,可以先将 PriorityQueue 转换为数组再进行排序。
```java
Queue q = new PriorityQueue<>(cmp);
int[] nums = {2, 5, 3, 4, 1, 6};
for (int i : nums) {
q.add(i);
}
Integer[] arr = q.toArray(new Integer[0]);
Arrays.sort(arr);
for (int i : arr) {
System.out.print(i + );
}
```
PriorityQueue 是 Java 中一种广泛使用的数据结构,它不仅能够存储元素,并且可以自定义比较器来调整排序规则。