我正在创建一个自定义优先级队列,我基本上将对象推送到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很新,并试图理解这里的流程。
答案 0 :(得分:0)
我会尽力为你澄清一些事情。
在documentation of PriorityQueue中,您会注意到它:
优先级队列的元素按照其自然顺序排序,或者由队列构造时提供的比较器排序,具体取决于使用的构造函数。优先级队列不允许null元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致ClassCastException)。
PriorityQueue
需要Comparator
或Comparable
个对象。只要提供其中一个,队列就会“按预期工作”,因为它只依赖于这些接口。
如果未提供比较器PriorityQueue
将尝试将元素转换为Comparable
,然后使用compareTo
方法确定如何对其进行排序。
当提供比较器时PriorityQueue
将只使用该对象执行元素比较并相应地对它们进行排序。
如需进一步阅读,您可以查看Java Tutorials,尤其是lesson on Interfaces and Inheritance。