PriorityQueues,自定义类和Comparable接口

时间:2017-08-31 05:03:42

标签: java priority-queue comparable

我有以下课程。

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?为什么?据我所知,我没有做任何比较。

3 个答案:

答案 0 :(得分:1)

From the docs:

  

基于优先级堆的无界优先级队列。优先级队列的元素根据其自然顺序排序,或者由队列构造时提供的比较器排序,具体取决于使用的构造函数。优先级队列不允许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
    }
});