在 Java 中将比较器与优先队列一起使用

Using Comparator with Priority Queue in Java

请帮助我处理以下代码行-(在 Java 中)

PriorityQueue<Node> pq
            = new PriorityQueue<>(
                new Comparator<Node>() {
                    public int compare(Node a, Node b)
                    {
                        return a.data - b.data;
                    }
                });

请解释以上代码行中到底发生了什么,以及在创建优先级队列对象时使用了哪种类型的构造函数。还请解释当返回 a.data-b.data 时,上述代码中的排序是如何发生的。 (节点与链表相关)

我认为查看 Java 文档可以回答您的问题:

要创建 PriorityQueue,请使用 PriorityQueue-class.

的构造函数

如果我们在 Java 11 (PriorityQueue (Java SE 11 & JDK 11) - Constructor Summary) 的文档中查看 PriorityQueue 的构造函数摘要,您正在使用此摘要的第 5 个构造函数。

本文档中的

Jumping to that constructor 向我们展示了以下内容:

public PriorityQueue​(Comparator<? super E> comparator)

Creates a PriorityQueue with the default initial capacity and whose elements are ordered according to the specified comparator.

Parameters:

comparator - the comparator that will be used to order this priority queue. If null, the natural ordering of the elements will be used.

Since: 1.8


现在让我们看一下您在 PriorityQueue.

的构造函数中用作参数的 Comparator

当我们查看文档 (Comparator (Java SE 11 & JDK 11 )) 时,我们发现 Comparator 不是 class,它是一个接口。

您在代码示例中所做的是创建一个匿名class。匿名 classes 使您能够同时声明和实例化一个 class。

这意味着您正在声明一个实现接口 Comparator 的新 class,并且您正在覆盖方法 public int compare(Node a, Node b)。在同一步骤中,您将创建此匿名 class 的新实例并将此实例传递给 PriorityQueue.

的构造函数

在这里您可以找到更多关于匿名 classes 的信息:Anonymous Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)