[英]HashMap Java Cannot Display Multiple Values
首先讓我說我有一個檔案。 有關詳細信息,請在此處查看 。
我已經在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)));
}
}
上面代碼的輸出是這樣的:
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();
您將在地圖中存儲對edges
的引用,然后清除edges
。 這就是為什么雖然元素仍然在地圖中,但它們是空白的。
你需要停止重用相同的edges
對象,並為每個頂點創建一個新的對象(為什么edges
甚至是你的類的成員,而不是局部變量?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.