了解覆盖如何与 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
需要 Comparator
或 Comparable
个对象。只要提供其中之一,队列就会 "work as it should" 因为它只依赖于这些接口。
当未提供比较器时,PriorityQueue
将尝试将元素转换为 Comparable
,然后使用 compareTo
方法确定如何对它们进行排序。
当提供比较器时 PriorityQueue
将简单地使用该对象来执行元素的比较并相应地对它们进行排序。
如需进一步阅读,您可以查看 Java Tutorials, in particular the lesson on Interfaces and Inheritance。
我正在创建一个自定义优先级队列,我基本上将对象推送到 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
需要 Comparator
或 Comparable
个对象。只要提供其中之一,队列就会 "work as it should" 因为它只依赖于这些接口。
当未提供比较器时,PriorityQueue
将尝试将元素转换为 Comparable
,然后使用 compareTo
方法确定如何对它们进行排序。
当提供比较器时 PriorityQueue
将简单地使用该对象来执行元素的比较并相应地对它们进行排序。
如需进一步阅读,您可以查看 Java Tutorials, in particular the lesson on Interfaces and Inheritance。