2010-11-04 52 views
8

我試圖創建一張地圖列表。在下面的代碼,我期待得到Java:創建一個HashMap列表

[{start=1,text=ye}, {start=2,text=no}] 
然而

,我只得到了

[{start=2,text=no}, {start=2,text=no}] 

如何避免覆蓋第一張地圖?這裏是我的代碼:

HashMap mMap = new HashMap(); 
ArrayList list = new ArrayList(); 
list.add(new HashMap()); 
mMap.put("start",1); 
mMap.put("text","yes"); 
list.add(mMap); 
mMap.put("start",2); 
mMap.put("text","no"); 
list.add(mMap); 
System.out.println("Final result: " + list); 

謝謝!

==========================

從Java學習者誰從程序語言背景(SAS)來了,我花了好幾個小時學習和試驗ArrayList,LinkedList,Map,LinkedMap等 - 我沒有得到它的工作。我不明白爲什麼用我有限的知識。現在,以下答案都非常出色!他們解釋了Java中非常重要的數據結構,至少對我而言。

謝謝大家!!!!

回答

28

您需要爲每個條目創建一個新的HashMap,而不是重用現有的HashMap。這會工作:

HashMap mMap = new HashMap(); 
mMap.put("start",1); 
mMap.put("text","yes"); 
list.add(mMap); 
mMap = new HashMap(); // create a new one! 
mMap.put("start",2); 
mMap.put("text","no"); 
list.add(mMap); 

也,你可以刪除list.add(new HashMap());作爲,增加了一個空映射到列表中是從來沒有填充的。

0

你永遠保存到該地圖的引用:

list.add(new HashMap()); 
0

有三個添加到列表中。第一個添加到一個新的地圖實例;你從來沒有設置任何值。第二個添加你傳遞給nMap的引用,它有1,是的。第三個添加你通過相同的參考。所以地圖現在有3個引用,第一個是你從未添加過任何值的地圖,第二個是同一個地圖。這就是爲什麼你得到相同的輸出。

1

是的,從這一段代碼

list.add(new HashMap()); 

散列圖不會被引用。所以最終你會得到3個項目的列表,其中2個是相同的。

5

一些東西,也許是還值得一提的是,是,你應該定義你的列表使用元素的類型,對於HashMap的它,因爲你是混合整數字符串不可能的。

而另一件事是,你應該使用列表接口類型,所以你能夠改變執行(ArrayList的或其他)的未來。

這裏更正後的代碼:

Map mMap = new HashMap(); 
List<Map> list = new ArrayList();