-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を印刷するときは問題ありませんが、グラフを印刷するときは、隣接するすべてのリストが空になります。どうしたの?

4

1 に答える 1

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);
}

そして、それをクリアするので、それをクリアするべきではありません。

于 2013-03-02T18:53:38.570 に答える