2016-11-23 110 views
0

这段代码有什么问题。我收到以下错误消息。线程“main”中的异常java.lang.ClassCastException:带有优先级队列和比较器

Exception in thread "main" java.lang.ClassCastException: Nodes cannot be cast to java.lang.Comparable 
    at java.util.PriorityQueue.siftUpComparable(Unknown Source) 
    at java.util.PriorityQueue.siftUp(Unknown Source) 
    at java.util.PriorityQueue.offer(Unknown Source) 
    at java.util.PriorityQueue.add(Unknown Source) 

请帮助

import java.util.Comparator; 
import java.util.InputMismatchException; 
import java.util.List; 
import java.util.PriorityQueue; 
import java.util.Queue; 

class Nodes implements Comparator<Nodes> { 
     public int n; 
     public int c; 

     public Nodes() { 
     } 

     public Nodes(int n, int c) { 
      this.n = n; 
      this.c = c; 
     } 

     @Override 
     public int compare(Nodes Nodes1, Nodes Nodes2) { 
      if (Nodes1.c < Nodes2.c) { 
       return -1; 
      } 
      if (Nodes1.c > Nodes2.c) { 
       return 1; 
      } 
      return 0; 
     } 
    } 
class dj 
{ 
    public static void main(String[] args) { 
Queue<Nodes> pq = new PriorityQueue<Nodes>(); 
    pq.add(new Nodes(5,4)); 
    pq.add(new Nodes(6,7)); 
    pq.add(new Nodes(7,6)); 
    pq.add(new Nodes(8,9)); 
    pq.add(new Nodes(9,8)); 
    pq.add(new Nodes(8,8)); 

    } 
} 
+3

你可能换货实现可比,而不是比较 –

+2

而提示:* *真正的东西在这里学习:学习阅读异常消息 - 他们会告诉你确切** **是怎么回事!这是学习编程时最重要的事情之一:您必须注意“比较器”与“可比较”不一样的细节。 – GhostCat

回答

2

,因为你实施了错误的接口您收到此错误。

你需要的是

class Nodes implements Comparable<Nodes> 

这表明节点类可以比到其他节点。 这是在PriorityQueue中使用它所需要的。

Comparator是一个比较对象的类,即使它们没有实现Comparable自己。它往往被传递到特定的排序函数,通常是独立于类本身的(可以具有不同的逻辑的多个比较器)

参看2类的JavaDoc以获得更多信息:

https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html
https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

+0

为了让您的答案完美,您可以将自己的Javadoc链接;-) – GhostCat

+0

TQ现在正在工作。 – pkumar