了解覆盖在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期望无论是ComparatorComparable对象。只要提供其中的一个,队列就会“按原样工作”,因为它只依赖于这些接口。

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

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

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