更新地图

时间:2009-07-01 16:29:31

标签: java collections

我有这样的地图:

private Map<String, List<List<String>>> someMap;
private List<List<String>> someList1;
private List<String> someList2;

....一些初始化..... ....一些名单人口......

然后我有,

if(someMap.get(someKey) == null){
     someList1.add(someList2);
     someMap.put(someKey, someList1);
} else {
     someMap.get(someKey).add(someList2);
}

请注意,添加到地图后列表会变得清晰,然后会填充。

例如,我有两个键“Apple”和“Orange”,带有一些值。循环之后,我只获得了橙色。之前的密钥被覆盖!!!

编辑:在循环的每次迭代中,都会填充一个列表。循环结束后,它会被添加到地图中,添加后,列表会变为清晰()。

有什么建议吗?感谢。

代码: http://pastebin.com/m2712e04 [根据要求..所以请不要责怪我发布它..]

3 个答案:

答案 0 :(得分:3)

根据您对Lucero问题的评论:

您是否一遍又一遍地重复使用相同的List实例,即执行

 someList1.add(someList2);
 someMap.put(someKey, someList1);
 someList1.clear()
 someList1.add(stuff)
 someMap.put(someOtherKey, someList1);

这不起作用,因为someList1.clear()将清除someMap 中的列表。您需要每次都创建一个新的List实例:

 someList1.add(someList2);
 someMap.put(someKey, someList1);
 someList1 = new List<...>();
 someList1.add(stuff)
 someMap.put(someOtherKey, someList1);

答案 1 :(得分:3)

仔细阅读您的代码:

你所描述的内容真的不应该发生。您应该使用调试器并逐步执行这些行,并检查这行代码是否实际上正在执行您正在考虑的事情(ln 57):

clientCode = account.getClientId().getClientCode();

很可能是在您到达第二行之前触发了异常,或者有意外的重复数据等。

另外,我之前说过的内容仍然有效。在158,而不是做:

reportDataSubList.clear();

待办事项

reportDataSubList = new ArrayList<String>();

你的循环顶部还有很多不必要的初始化。


关于你的评论:

  

在循环的每次迭代中,列表   得到人口。它循环结束了   添加到地图并添加后   列表清晰()

我很惊讶这不会破坏任何东西。地图中的所有列表都应为空。


如果你没有这样做

List a = new ArrayList();

但正在做

a.clear();

然后清楚为什么列表是空的。您的所有参赛作品都是相同的参考。

宣布

List a = new ArrayList();

您正在创建List对象的新实例,无论您对此对象执行的操作都不会影响您已创建的内容。

答案 2 :(得分:2)

我怀疑你想要一遍又一遍地添加相同的列表。您需要为每个新密钥创建新的列表实例。

编辑:您的someKey变量是否会发生变化?您是否使用调试器进入代码并查看发生了什么?

编辑:更像这样:

// store the current payment info
reportDataSubList = new ArrayList<String>();
reportDataSubList.add(clientCode);
//...                                   
reportDataList = reportData.get(clientCode);
if(reportDataList == null){
    reportDataList = new ArrayList<List<String>>();
    reportData.put(clientCode, reportDataList);
}
reportDataList.add(reportDataSubList);

但我不确定您使用的数据结构是否适合该任务。正确的实体对象甚至是XML都可以与悍马匹配。