了解覆盖如何与 Java 优先级队列中的 compareTo 一起使用?

Understanding how the override works with compareTo in a Java priority queue?

我正在创建一个自定义优先级队列,我基本上将对象推送到 PQ 并按该对象中的特定键排序:

优先队列条目Class

package Graphs;

public class PQEntry implements Comparable<PQEntry> {
    public int node;
    public int nodeVal;

    public PQEntry(int node, int nodeVal) {
        this.node = node;
        this.nodeVal = nodeVal;
    }

    @Override
    public String toString() {
        return "Node: " + this.node + ", Value: " + this.nodeVal;
    }

    public int getNodeVal() {
        return this.nodeVal;
    }

    @Override
    public int compareTo(PQEntry other) {
        return Integer.compare(this.getNodeVal(), other.nodeVal);
    }
}

现在,一切正常,优先级正常工作:

PriorityQueue<PQEntry> pq = new PriorityQueue();

但我是 Java 的新手,我对 how/where/when 我的 PQEntry class 中的 compareTo 应用到 PriorityQueue class 以及这是怎么回事感到困惑完全正常工作。

当我在 PriorityQueue 中调用 add 函数时,它会启动一些交换算法,从我的 PQEntry class 调用超级方法吗?我对 Java 有点陌生,想了解这里的流程。

我会尽力为您澄清事情。

documentation of PriorityQueue 中,您会注意到它指出:

The elements of the priority queue are ordered according to their natural ordering, or by a Comparator provided at queue construction time, depending on which constructor is used. A priority queue does not permit null elements. A priority queue relying on natural ordering also does not permit insertion of non-comparable objects (doing so may result in ClassCastException).

PriorityQueue 需要 ComparatorComparable 个对象。只要提供其中之一,队列就会 "work as it should" 因为它只依赖于这些接口。

当未提供比较器时,PriorityQueue 将尝试将元素转换为 Comparable,然后使用 compareTo 方法确定如何对它们进行排序。

当提供比较器时 PriorityQueue 将简单地使用该对象来执行元素的比较并相应地对它们进行排序。

如需进一步阅读,您可以查看 Java Tutorials, in particular the lesson on Interfaces and Inheritance