了解覆盖在Java优先级队列中如何与compareTo配合使用?
问题描述:
我正在做一个自定义的优先级队列,我基本上是物体推到PQ和排序在该对象的特定键:了解覆盖在Java优先级队列中如何与compareTo配合使用?
优先级队列项类
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类,以及如何,这正是工作。
当我调用PriorityQueue
中的add
函数时,它是否会启动一些从我的PQEntry类中调用超级方法的交换算法?我对Java真的有点新鲜,并试图理解这里的流程。
答
我会尽力为你澄清事情。
在documentation of PriorityQueue,你会发现它指出:
优先级队列中的元素进行排序,根据自己的自然顺序,或者通过队列构造的时候提供一个比较,这取决于使用的构造。优先级队列不允许空元素。依赖于自然顺序的优先级队列也不允许插入非可比对象(这样做可能导致ClassCastException)。
的PriorityQueue
期望无论是Comparator
或Comparable
对象。只要提供其中的一个,队列就会“按原样工作”,因为它只依赖于这些接口。
当没有提供比较器时PriorityQueue
会尝试将元素转换为Comparable
,然后使用compareTo
方法确定如何对它们进行排序。
当提供比较器时,PriorityQueue
将简单地使用该对象执行元素比较并相应地对它们进行排序。
如需进一步阅读,您可以查看Java Tutorials,特别是lesson on Interfaces and Inheritance。