2013-03-02 86 views
-1

我想从文件读取数据并从中构建图形。我做了所有事情,所有的顶点都是正常创建的,但是当我将它们添加到图形中时,它们的相邻列表(它们的键值是相邻顶点的数字,值是它们的距离)变成空的。请问任何人,请告诉我的代码有什么问题?向图中添加一个顶点

public class Vertex { 
private int number; 
private LinkedHashMap<Integer, Integer> adjacent; 

public Vertex(int num) { 
    this.number = num; 
    this.adjacent = new LinkedHashMap<Integer, Integer>(); 
} 

}

public class Graph { 
private ArrayList<Vertex> vertices; 
private int verticesSize = 201; 

public Graph() { 
    Vertex initialVertex = new Vertex(0); 
    this.vertices = new ArrayList<Vertex>(); 
    for(int i = 0; i < verticesSize; i++) { 
     vertices.add(i, initialVertex); 
    } 

} 

}

public class Test { 

public static void printGraph(Graph graph) { 
    for(int i = 0; i < graph.getVerticesSize(); i++) 
      System.out.println(graph.getVertices().get(i)); 
} 

public static void main(String[] args) throws IOException { 
    FileInputStream fStream = new FileInputStream("C:/Lusine/Programming/Java/dijkstraData.txt"); 
    // Use DataInputStream to read binary NOT text. 
    BufferedReader bReader = new BufferedReader(new InputStreamReader(fStream)); 

    Graph graph = new Graph(); 
    String[] maps; 

    String line; 
    LinkedHashMap<Integer, Integer> currentMap = new LinkedHashMap<Integer, Integer>(); 

    while((line = bReader.readLine()) != null) { 
     maps = line.split("\t"); 
     int firstDigit = Integer.parseInt(maps[0]); 

      Vertex v = new Vertex(firstDigit); 

      for(int i = 1; i < maps.length; i++) { 
      String[] vertexDistance = maps[i].split(","); 
      int vertex = Integer.parseInt(vertexDistance[0]); 
      int distance = Integer.parseInt(vertexDistance[1]); 
      currentMap.put(vertex, distance); 
      } 

      v.setAdjacent(currentMap); 
      graph.getVertices().set(firstDigit, v); 
      System.out.println("\n" + firstDigit +"-th vertex is\n" + v); 
      currentMap.clear(); 

    } 
    printGraph(graph); 
} 

当我打印V,它的确定,但是当我打印图形,所有相邻列表是空的。有什么问题?

+0

但是当你将它们添加到图表中时会发生什么?我想你忘了描述问题了。 – cytinus 2013-03-02 18:50:45

+0

哦,真的!我编辑了我的问题。谢谢 – user2081119 2013-03-02 18:51:52

回答

1

你的循环归结为

LinkedHashMap<Integer, Integer> currentMap = new LinkedHashMap<Integer, Integer>(); 

while (...) { 
    Vertex v = new Vertex(...); 
    v.setAdjacent(currentMap); 
    currentMap.clear(); 
} 

所以,你要存储相邻顶点的同一地图中的每个顶点,并清除该地图在每次迭代结束。很显然,所有的顶点在循环结束时共享相同的空映射。

你应该在每次迭代创建一个新的LinkedHashMap:

while (...) { 
    LinkedHashMap<Integer, Integer> currentMap = new LinkedHashMap<Integer, Integer>(); 
    Vertex v = new Vertex(...); 
    v.setAdjacent(currentMap); 
} 

,你应该还不清楚它,cince清除它,嗯...将其清除。

+0

我工作过!谢谢! – user2081119 2013-03-02 18:56:57