2016-04-25 133 views
-3

当我在做BFS时向顶点添加一个顶点时,得到ClassCastException。需要帮助 信息:Vertex是一个用户定义的类,它具有Edge类对象的链表。我该如何解决这个ClassCastException?

这里是我的代码:

private void reachable() { 
     clearAll(); 

     for (Vertex v : vertexMap.values()) 
      v.setColor("white"); 

     for (Vertex s : vertexMap.values()) 
      if (s.isStatus()) 
       bfs(s); 
    } 

    private void bfs(Vertex s) { 

     s.setColor("gray"); 
     s.dist = 0; 
     s.prev = null; 

     Queue<Vertex> vertices = new PriorityQueue<Vertex>(); 
     vertices.add(s); 

     while (!vertices.isEmpty()) { 
      Vertex u = vertices.remove(); 
      for (Iterator i = u.adjacent.iterator(); i.hasNext();) { 
       Edge edge = (Edge) i.next(); 
       Vertex adj = edge.getDestVertex(); 
       if (!adj.getName().equals(u.getName()) && adj.isStatus()) 
        if (adj.getColor().equals("white")) { 
         adj.setColor("gray"); 
         adj.dist = u.dist + 1; 
         adj.prev = u; 
         vertices.add(adj); 
        } 
      } 
      u.setColor("black"); 
     } 
    } 
+1

用完整的堆栈跟踪发布异常不是一个坏主意。 – Gimby

+0

线程“main”中的异常java.lang.ClassCastException:project2.Vertex不能转换为java.lang.Comparable – aninditha

+0

在上面的代码中没有对'java.lang.Comparable'进行转换。请在问题中添加完整的堆栈跟踪(不作为注释!) –

回答

1

我猜测,问题就在这里:

Queue<Vertex> vertices = new PriorityQueue<Vertex>(); 
    vertices.add(s); // <<<---- HERE 

一个PriorityQueue需要能够比较参数类型的实例(即Vertex)以确定他们的相对优先权。如果您使用Comparator<Vertex>对象作为参数实例化队列,则队列将使用该对象来确定优先级。否则,它预计Vertex实施Comparable<Vertex>

发生异常是因为在add操作中,代码试图将Vertex对象转换为Comparable

解决方案:

  1. 声明类如... class Vertex implements Comparable<Vertex>并提供int compareTo(Vertex)方法的实现。

  2. 执行Comparator<Vertex>类,执行int compare(Vertex, Vertex)并将实例传递给PriorityQueue构造函数。 (你可以使用匿名类)。

无论哪种方式,比较/ compareTo方法是队列的优先顺序的依据。相应地实施它。