了解覆盖如何在Java优先级队列中使用compareTo?

时间:2017-10-21 21:11:43

标签: java compare heapsort

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

优先级队列条目类

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的新手,我很困惑我的PQEntry类中的compareTo如何/何时/何时应用于PriorityQueue类以及它是如何正常工作的。

当我在add内调用PriorityQueue函数时,是否启动了一些从我的PQEntry类调用超级方法的交换算法?我真的对Java很新,并试图理解这里的流程。

1 个答案:

答案 0 :(得分:0)

我会尽力为你澄清一些事情。

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

  

优先级队列的元素按照其自然顺序排序,或者由队列构造时提供的比较器排序,具体取决于使用的构造函数。优先级队列不允许null元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致ClassCastException)。

PriorityQueue需要ComparatorComparable个对象。只要提供其中一个,队列就会“按预期工作”,因为它只依赖于这些接口。

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

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

如需进一步阅读,您可以查看Java Tutorials,尤其是lesson on Interfaces and Inheritance