2016-04-25 100 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方法是隊列的優先順序的依據。相應地實施它。