2014-02-23 63 views
0

我正在使用寬度第一搜索遍歷數組列表。現在我有一個Graph類和一個Node類。我遇到的問題是這條線:for(Node adj : n.adjacentNodes){,我認爲它與這一行的類型鑄造有關:Node n = (Node)q.poll();類型鑄造我的參考節點類

編譯器不喜歡這樣,但爲什麼是這樣呢?除了我的對象n的類型爲Node並且我試圖在此循環中遍歷它之外,我可以更改編譯器的內容嗎?

這裏是我的代碼:

節點類:

import java.util.*; 

public class Node { 

     public String data; // data element 
     public boolean visited=false; // flag to track the already visited node 
     public List adjacentNodes = new LinkedList(); // adjacency list 
     public Node rootNode; 

     public Node(String data){ 
      this.data = data; 
     } 

     public void addAdjacentNode(final Node node){ 
      adjacentNodes.add(node); 
      node.adjacentNodes.add(this); 
      adjacentNodes.add(rootNode); 
      node.adjacentNodes.add(this); 
     } 

    } 

我的圖類:

import java.util.*; 


/*- enqueue the start node to a Queue 
- make the start node as visited 
- while queue is not empty 
    - dequeue the node lets say u 
    - print or whatever you want to 
    - for every adjacent node v of u 
     - if v is not already visited 
      - mark v as visited 
      - enqueue v to the Queue*/ 
public class Graph { 

    public List nodes = new ArrayList(); 

    public void breadthFirstTraversal(Node rootNode){ 
     Queue<Node> q = new LinkedList<Node>(); 
//  Queue q = new LinkedList(); 
     q.add(rootNode); 
     printNode(rootNode); 
     rootNode.visited=true; 
     while(!q.isEmpty()){ 
      Node n = (Node)q.poll(); 
      System.out.print(n.data + " "); 
      for(Node adj : n.adjacentNodes){ 
       if(!adj.visited){ 
        adj.visited=true; 
        q.add(adj); 
       } 
      } 
      clearNodes(); 
     } 

    } 

    private void clearNodes() { 
     // TODO Auto-generated method stub 
     nodes = null; //clear nodes and set to null 
    } 

    private void printNode(Node node) { 
     // TODO Auto-generated method stub 
     System.out.print(node); 
    } 

    public static void main(String[] args) { 

     Node frankfurt = new Node("frankfurt"); 
     Node mannheim = new Node("mannheim"); 
     Node wurzburg = new Node("wurzburg"); 
     Node stuttgard = new Node("stuttgard"); 
     Node kassel = new Node("kassel"); 
     Node karlsruhe = new Node("karlsruhe"); 
     Node erfurt = new Node("erfurt"); 
     Node numberg = new Node("numberg"); 
     Node augsburg = new Node("augsburg"); 
     Node munchen = new Node("munchen"); 

     Graph g = new Graph(); 

     g.nodes.add(frankfurt); 
     g.nodes.add(mannheim); 
     g.nodes.add(wurzburg); 
     g.nodes.add(stuttgard); 
     g.nodes.add(kassel); 
     g.nodes.add(karlsruhe); 
     g.nodes.add(erfurt); 
     g.nodes.add(numberg); 
     g.nodes.add(augsburg); 
     g.nodes.add(munchen); 

     frankfurt.addAdjacentNode(mannheim); 
     frankfurt.addAdjacentNode(wurzburg); 
     frankfurt.addAdjacentNode(kassel); 

     mannheim.addAdjacentNode(karlsruhe); 

     karlsruhe.addAdjacentNode(augsburg); 

     augsburg.addAdjacentNode(munchen); 

     munchen.addAdjacentNode(kassel); 
     munchen.addAdjacentNode(numberg); 

     wurzburg.addAdjacentNode(erfurt); 
     wurzburg.addAdjacentNode(numberg); 

     numberg.addAdjacentNode(stuttgard); 

     g.breadthFirstTraversal(frankfurt); 
    } 

} 

回答

2

宣告你的隊列時,如果指定的元素的 '類型',它會存儲然後你不需要演員。 Queue q = new LinkedList();

正確方法:

Queue<Node> q = new LinkedList<Node>(); 
+0

所以我更新的代碼,但日食仍然給在這一行的錯誤:(節點形容詞:n.adjacentNodes){//它強調n.adjacentNodes和我有點困惑,爲什麼 – AOE

+0

更改類節點中的成員聲明: public List adjacentNodes = new LinkedList (); //鄰接列表 – Kakarot