0

まず、ファイルがあると言いましょう。詳細については、こちらを確認してください

ハッシュマップに複数の値を持つエッジをすでに追加しました。このコードを追加して確認しました。

        map.put(nodes.get(i), edges);
        System.out.println(nodes.get(i) + " " +  map.get(nodes.get(i)));

各エントリをマップに追加した後、正常に追加されたかどうかをすぐに確認します。はい、うまくいきました。

出力は次のとおりです。

a0 [acodijkstra.Edge@b1c5fa]
a1 [acodijkstra.Edge@13caecd, acodijkstra.Edge@f84386, acodijkstra.Edge@1194a4e]
a2 [acodijkstra.Edge@15d56d5, acodijkstra.Edge@efd552, acodijkstra.Edge@19dfbff]
a3 [acodijkstra.Edge@10b4b2f, acodijkstra.Edge@750159, acodijkstra.Edge@1abab88]

しかし、マップのコンテンツを表示する別のメソッドを作成すると、マップが空であることがわかりました。コードは次のとおりです。

public void viewFile() {
    for(int i=0; i<nodes.size();i++) {
        System.out.println(nodes.get(i) + " " + this.map.get(nodes.get(i)));
    }
}

上記のコードの出力は次のとおりです。

a0 []
a1 []
a2 []
a3 []

これの考えられる理由は何でしょうか?なぜこれが起こったのか私は本当に混乱しています。

コードについては、次のように簡略化されています(準拠している場合、不要と思われる部分を編集したため、エラーが発生します)。

class Reader {

    HashMap<String, Vertex> vertexList;
    Map<String, ArrayList<Edge>> map;
    ArrayList<String> nodes;
    ArrayList<Edge> edges;


public Reader(String fileName) {
    vertexList = new HashMap<String, Vertex>();
    map = new HashMap<String, ArrayList<Edge>>();
    nodes = new ArrayList<String>();
    edges = new ArrayList<Edge>();
    readFile(fileName);
}

private void readFile(String fileName) {

    try{
        FileReader file = new FileReader(fileName);
        Scanner sc = new Scanner(file);

        int i = 0;
        while (sc.hasNextLine()) {
          input.add(sc.nextLine());
          i++;
        }

        setNodes();
        setVertices();
        System.out.println();
        file.close();
    } catch(Exception e){
        System.out.println(e);
    }
}
public void setNodes() {

    System.out.println();

    for(int i=0; i<input.size(); i++) {
        line = this.input.get(i);
        nodes.add(line.substring(0,line.indexOf("-")).trim());
        adjLine.add(line.substring(line.indexOf("-")+1).trim());
    }
}

private void setVertices() {

    String[] listEdges;

    for(int i=0; i<nodes.size(); i++) {

        //if vertex does not exist, create it
        if(vertexList.containsKey(nodes.get(i))) {
            vertexList.put(nodes.get(i), new Vertex(nodes.get(i)));
        }

        line = adjLine.get(i);

        //separate adj edges to *
        if(line.contains("*")) {
            listEdges = line.split("\\*");
        } else {
            listEdges = new String[1];
            listEdges[0] = line;
        }

        //add edges to specified vertex
        for(int j=0; j < listEdges.length; j++ ) {
            String[] word = listEdges[j].split(",");
            edges.add(new Edge(vertexList.get(word[0]),Double.parseDouble(word[1])));
        }

        map.put(nodes.get(i), edges);
        System.out.println(nodes.get(i) + " " +  map.get(nodes.get(i)));
        edges.clear();
    }
}
4

1 に答える 1

2

ここ:

    map.put(nodes.get(i), edges);
    System.out.println(nodes.get(i) + " " +  map.get(nodes.get(i)));
    edges.clear();

マップにへの参照を保存してからedges、をクリアしedgesます。これが、要素がまだマップにある間は空白である理由です。

同じオブジェクトの再利用をやめ、edges頂点ごとに新しいオブジェクトを作成する必要があります(edgesローカル変数ではなく、クラスのメンバーであるのはなぜですか?)

于 2013-03-19T06:31:02.177 に答える