我试图创建一个地图列表。在下面的代码中,我期待得到
[{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 );
谢谢!
==========================
作为一名来自程序语言背景(SAS)的Java学习者,我花了不少时间学习和试验ArrayList,LinkedList,Map,LinkedMap等等 - 我感到很冷静。我不明白为什么我的知识有限。现在,以下答案都很棒!他们在Java中解释了非常重要的数据结构,至少对我而言。
谢谢大家!!!!
答案 0 :(得分:32)
您需要为每个条目创建一个新的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());
,因为这会将空地图添加到您从未填充的列表中。
答案 1 :(得分:6)
也许值得一提的是,你应该定义你在 List 中使用的元素的类型,对于HashMap来说,这是不可能的,因为你正在混合整数< / em>和字符串。
另一件事是您应该使用 List 接口作为类型,这样您就可以在将来更改实现( ArrayList 或其他)。
这里是更正后的代码:
Map mMap = new HashMap();
List<Map> list = new ArrayList();
答案 2 :(得分:1)
是的,来自这段代码的哈希映射
list.add(new HashMap());
永远不会引用。所以最终你得到了3个项目的清单,其中2个是相同的。
答案 3 :(得分:0)
您永远不会保存对此地图的引用:
list.add(new HashMap());
答案 4 :(得分:0)
列表中有三个添加内容。第一个添加是一个新的地图实例;你永远不会设置任何值。第二个添加你传递给nMap的引用,它有1,是的。第三个添加你传递相同的引用。所以Map现在有3个引用,第一个是你从未添加任何值的地图,下一个是同一个地图。这就是为什么你得到相同的输出。
答案 5 :(得分:0)
当您在地图中输入相同的键名时,值将被覆盖为相同的键。 假设我们有
mMap.put("start",1);
mMap.put("start",2);
mMap.put("start",3);
mMap.put("start",4);
它将不会生成长度为4的映射,因为键(“ start”)相同,因此它将覆盖同一键上的值。因此您只能通过“开始”键获得一个值(4)。 为了避免这种情况,您必须在哈希图中更改键的名称,但是在您的scenaro中,您需要另一个哈希图实例来保存键和值,因为您要维护arralist。