我有以下课程。
private static class Node {
public int id; // 0 indexed
public int distFromS;
Node(int id, int distFromS) {
this.id = id;
this.distFromS = distFromS;
}
}
我将Node
的实例存储在PriorityQueue
并操纵它们......
PriorityQueue<Node> procQueue = new PriorityQueue<Node>();
int[] distsFromS = new int[n];
Arrays.fill(distsFromS, -1);
// Read in s, add to processing queue
int s = (in.nextInt()) - 1; // 0 indexed
procQueue.add(new Node(s, 0));
// While queue isn't empty
while (procQueue.size() > 0) {
// deque "curr". If we haven't already reached curr from s
Node curr = procQueue.remove();
if (distsFromS[curr.id] == -1) {
// record distance.
distsFromS[curr.id] = curr.distFromS;
// enqueue all children of curr. distFromS = curr.distFromS + 6
Iterator<Integer> itr = edges[curr.id].iterator();
while(itr.hasNext()) {
procQueue.add(new Node(itr.next(), curr.distFromS + EDGE_WEIGHT)); // ***Exception is here***
}
}
}
但是我得到以下例外:
Exception in thread "main" java.lang.ClassCastException: Solution$Node cannot be cast to java.lang.Comparable
at java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:652)
at java.util.PriorityQueue.siftUp(PriorityQueue.java:647)
at java.util.PriorityQueue.offer(PriorityQueue.java:344)
at java.util.PriorityQueue.add(PriorityQueue.java:321)
at Solution.main(Solution.java:52)
我是否需要为compareTo
实施Node
?为什么?据我所知,我没有做任何比较。
答案 0 :(得分:1)
基于优先级堆的无界优先级队列。优先级队列的元素根据其自然顺序排序,或者由队列构造时提供的比较器排序,具体取决于使用的构造函数。优先级队列不允许null元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能导致ClassCastException)。
您需要指定比较器,否则您的课程需要具有可比性
否则,PriorityQueue
无法知道哪些对象具有优先权。
答案 1 :(得分:1)
是的,你需要实施可比较的。
https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html#add(E)
抛出
ClassCastException - 如果无法与指定的元素进行比较 根据优先级,当前在此优先级队列中的元素 队列排序
答案 2 :(得分:1)
你需要让你的类Node实现Comparable
private static class Node implements Comparable<Node> {
public int id; // 0 indexed
public int distFromS;
Node(int id, int distFromS) {
this.id = id;
this.distFromS = distFromS;
}
@Override
public int compareTo(Node another) {
// your codes here
}
}
或在构造PriorityQueue时给出比较器
PriorityQueue<Node> queue = new PriorityQueue<>(new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
// your codes here
}
});