HashMap Java无法显示多个值

HashMap Java无法显示多个值,java,hashmap,multiple-value,Java,Hashmap,Multiple Value,让我先说我有一个文件。更多信息,请查看 我已经在hashmap上添加了多个值的边。我通过添加以下代码进行检查: map.put(nodes.get(i), edges); System.out.println(nodes.get(i) + " " + map.get(nodes.get(i))); 在将每个条目添加到地图之后,我会立即检查它是否被成功添加。是的,成功了 以下是输出: a0 [acodijkstra.Edge@b1c5fa] a1 [acodij

让我先说我有一个文件。更多信息,请查看

我已经在hashmap上添加了多个值的边。我通过添加以下代码进行检查:

        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)));
    }
}
可能的原因是什么?我真的很困惑为什么会发生这种事

对于代码,这里是简化版本(如果遵守,这将导致错误,因为我编辑了一些被认为不必要的部分):

类读取器{
HashMap顶点列表;
地图;
阵列列表节点;
阵列列表边;
公共读取器(字符串文件名){
vertexList=新HashMap();
map=新的HashMap();
节点=新的ArrayList();
边=新的ArrayList();
读取文件(文件名);
}
私有void readFile(字符串文件名){
试一试{
FileReader文件=新的FileReader(文件名);
扫描仪sc=新扫描仪(文件);
int i=0;
while(sc.hasNextLine()){
input.add(sc.nextLine());
i++;
}
setNodes();
设置顶点();
System.out.println();
file.close();
}捕获(例外e){
系统输出打印ln(e);
}
}
公共void setNodes(){
System.out.println();
对于(int i=0;i这里:

您正在地图中存储对
的引用,然后清除
。这就是为什么当元素仍在地图中时,它们是空的


您需要停止重用相同的
edges
对象,并为每个顶点创建一个新的对象(为什么
edges
甚至是类的成员,而不是局部变量?

我们需要查看更多的代码,特别是构建地图的代码。@princepiero如何以及在何处调用viewFile()方法?嗨@NPE我编辑了这个问题。:@Lakshmi包括在上面。好吧,那么@NPE说的是对的。我试着删除了边。clear();line然后我在下一个要添加的元素上得到了很多边。添加的原因。清除是为了清除ArrayList边。这真的很重要吗,因为我已经在地图上添加了边,@NPE?@princepiero:你不是在添加
边的副本,而是在添加对它的引用。如果在将它添加到地图后,你更改了e> edges
,映射发生变化。这解决了问题。谢谢。我刚刚将edges设置为局部变量,并在循环中初始化它。非常有帮助!:)
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();
    }
}
    map.put(nodes.get(i), edges);
    System.out.println(nodes.get(i) + " " +  map.get(nodes.get(i)));
    edges.clear();