2010-11-04 50 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();