【问题标题】:Using Comparator with Priority Queue in Java [closed]在Java中使用带有优先级队列的比较器[关闭]
【发布时间】:2021-05-31 05:58:00
【问题描述】:

请帮助我使用以下代码行-(在 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 返回时,排序是如何发生的。 (节点与链表相关)

【问题讨论】:

  • 这里有大约十个问题,最终都归结为“我看不懂这段代码”。一步一步来。首先了解Comparator 是什么(有Javadocs),然后看看PriorityQueue 的构造函数。如果这些步骤太大或 Javadocs 无法理解,那么请选择一本关于 Java 类的好书/教程,并确保您牢牢掌握。
  • 除此之外,您还需要了解什么是匿名类。
  • 这里要理解的关键部分是new Comparator&lt;Node&gt;() { 部分,它创建了一个匿名类的实例。由于您似乎不知道那是什么,因此您现在应该拿起您的 Java 指南并寻找一个教您匿名类的部分。

标签: java comparator


【解决方案1】:

我认为查看 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> 比较器)

使用默认初始容量创建一个 PriorityQueue,其元素根据指定的比较器进行排序。

参数:

比较器 - 将用于排序此优先级队列的比较器。如果为 null,则将使用元素的自然顺序。

因为: 1.8


现在让我们看看您在PriorityQueue 的构造函数中用作参数的Comparator

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

您在代码示例中所做的是创建一个匿名类。匿名类使您可以同时声明和实例化一个类。

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

您可以在此处找到有关匿名类的更多信息:Anonymous Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多