2013-03-19 64 views
0

讓我先說我有一個文件。欲瞭解更多信息,請檢查它hereHashMap Java無法顯示多個值

我已經在hashmap中添加了多個值的邊。我加入這段代碼檢查:

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

增加每次進入地圖後,我檢查它的時候了,如果成功添加它。是的,它的工作。

下面是輸出:

a0 [[email protected]] 
a1 [[email protected], [email protected], [email protected]] 
a2 [[email protected], [email protected], [email protected]] 
a3 [[email protected], [email protected], [email protected]] 

但是,創造另一種方法來顯示地圖的內容時,我發現地圖是空的。下面的代碼:

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(); 
    } 
} 
+0

我們需要看到更多的你代碼,特別是構建地圖的代碼。 – NPE 2013-03-19 06:21:13

+0

@princepiero如何以及​​在哪裏調用viewFile()方法? – Lakshmi 2013-03-19 06:25:26

+0

hi @NPE我編輯了這個問題。 :) – princepiero 2013-03-19 06:28:47

回答

2

這裏:

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

你在地圖中存儲對edges的引用,然後清除edges。這就是爲什麼,雖然元素仍然在地圖中,但它們是空白的。

你需要停下來重用相同edges對象,並創建一個新的每個頂點(爲什麼是edges甚至你的類的成員,而不是一個局部變量?)

+0

我試着刪除edges.clear();然後我在接下來的元素上添加了很多邊緣。添加.clear的原因是清除ArrayList邊緣。是否真的很重要,因爲我已經在地圖上添加了邊界@NPE? – princepiero 2013-03-19 06:33:45

+1

@princepiero:你沒有添加* edges *的副本,你正在給它添加一個*引用*。如果在將其添加到地圖後,更改了「邊緣」,則地圖會發生變化。 – NPE 2013-03-19 06:34:23

+0

我明白你的觀點。謝謝。現在將實施它。 – princepiero 2013-03-19 06:35:06