Java PriorityQueue

PriorityQueue类提供了堆数据结构的功能。

它实现了Queue接口

The Java PriorityQueue class implements the Queue interface.

与普通队列不同,优先队列的元素以排序的顺序检索。

假设我们想按升序检索元素。在这种情况下,优先队列的头将是最小的元素。一旦检索到该元素,下一个最小的元素将成为队列的头。

需要注意的是,优先队列的元素可能未排序。但是,元素总是按排序顺序检索。


创建PriorityQueue

为了创建优先队列,我们必须导入java.util.PriorityQueue包。导入包后,以下是如何在Java中创建优先队列。

PriorityQueue<Integer> numbers = new PriorityQueue<>();

这里,我们创建了一个没有参数的优先队列。在这种情况下,优先队列的头是队列中最小的元素。并且元素从队列中按升序移除。

但是,我们可以使用Comparator接口来自定义元素的排序。我们将在本教程的后面学习。


PriorityQueue的方法

PriorityQueue类提供了Queue接口中所有方法的实现。


向PriorityQueue插入元素

  • add() - 将指定元素插入队列。如果队列已满,则会引发异常。
  • offer() - 将指定元素插入队列。如果队列已满,则返回false

例如,

import java.util.PriorityQueue;

class Main {
    public static void main(String[] args) {

        // Creating a priority queue
        PriorityQueue<Integer> numbers = new PriorityQueue<>();

        // Using the add() method
        numbers.add(4);
        numbers.add(2);
        System.out.println("PriorityQueue: " + numbers);

        // Using the offer() method
        numbers.offer(1);
        System.out.println("Updated PriorityQueue: " + numbers);
    }
}

输出

PriorityQueue: [2, 4]
Updated PriorityQueue: [1, 4, 2]

在这里,我们创建了一个名为numbers的优先队列。我们将4和2插入队列。

尽管4先于2插入,但队列的头是2。这是因为优先队列的头是队列中最小的元素。

然后我们将1插入队列。队列现在被重新排列,以将最小的元素1存储在队列的头部。


访问PriorityQueue元素

要访问优先队列中的元素,我们可以使用peek()方法。此方法返回队列的头部。例如,

import java.util.PriorityQueue;

class Main {
    public static void main(String[] args) {

        // Creating a priority queue
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.println("PriorityQueue: " + numbers);

        // Using the peek() method
        int number = numbers.peek();
        System.out.println("Accessed Element: " + number);
    }
}

输出

PriorityQueue: [1, 4, 2]
Accessed Element: 1

移除PriorityQueue元素

  • remove() - 从队列中移除指定的元素
  • poll() - 返回并移除队列的头部

例如,

import java.util.PriorityQueue;

class Main {
    public static void main(String[] args) {

        // Creating a priority queue
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.println("PriorityQueue: " + numbers);

        // Using the remove() method
        boolean result = numbers.remove(2);
        System.out.println("Is the element 2 removed? " + result);

        // Using the poll() method
        int number = numbers.poll();
        System.out.println("Removed Element Using poll(): " + number);
    }
}

输出

PriorityQueue: [1, 4, 2]
Is the element 2 removed? true
Removed Element Using poll(): 1

遍历PriorityQueue

要遍历优先队列的元素,我们可以使用iterator()方法。为了使用此方法,我们必须导入java.util.Iterator包。例如,

import java.util.PriorityQueue;
import java.util.Iterator;

class Main {
    public static void main(String[] args) {

        // Creating a priority queue
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.print("PriorityQueue using iterator(): ");

        //Using the iterator() method
        Iterator<Integer> iterate = numbers.iterator();
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

输出

PriorityQueue using iterator(): 1, 4, 2,

其他PriorityQueue方法

方法 描述
contains(element) 在优先队列中搜索指定的元素。如果找到元素,则返回true,否则返回false
size() 返回优先队列的长度。
toArray() 将优先队列转换为数组并返回。

PriorityQueue Comparator

在上面的所有示例中,优先队列元素都按自然顺序(升序)检索。但是,我们可以自定义此排序。

为此,我们需要创建自己的比较器类,该类实现Comparator接口。例如,

import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
    public static void main(String[] args) {

        // Creating a priority queue
        PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        numbers.add(3);
        System.out.print("PriorityQueue: " + numbers);
    }
}

class CustomComparator implements Comparator<Integer> {

    @Override
    public int compare(Integer number1, Integer number2) {
        int value =  number1.compareTo(number2);
        // elements are sorted in reverse order
        if (value > 0) {
            return -1;
        }
        else if (value < 0) {
            return 1;
        }
        else {
            return 0;
        }
    }
}

输出

PriorityQueue: [4, 3, 1, 2]

在上面的示例中,我们创建了一个优先队列,并将CustomComparator类作为参数传递。

CustomComparator类实现了Comparator接口。

然后我们重写compare()方法。该方法现在使元素成为最大的数字。

要了解更多关于比较器的信息,请访问Java Comparator


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战