【发布时间】:2015-02-05 08:14:38
【问题描述】:
我必须使用循环向 hashmap 添加一些列表数据。当我使用不同的键将第二个列表添加到 hashmap 时,hashmap 中的第一个列表也被第二个列表替换。为什么会发生这种情况?请帮助我解决这个问题。下面是我的代码
private List<COAAccount> dataCoa=new ArrayList<COAAccount>();
private List<COAAccount> finalList=new ArrayList<COAAccount>();
private Map<Integer,List<COAAccount>> brkDBMap;
private Map<Integer,List<COAAccount>> brkVwMap=new HashMap<Integer, List<COAAccount>>();
我已将一些值加载到 brkDBMap。然后,
Iterator itDB = brkDBMap.entrySet().iterator();
while (itDB.hasNext()) {
Map.Entry pairs = (Map.Entry)itDB.next();
int key=(int) pairs.getKey();
List<COAAccount> valueList=(List<COAAccount>) pairs.getValue();
if(brkVwMap.containsKey(key)) {
System.out.println("****EXIST******");
}else{
//finalList=new ArrayList<COAAccount>();
finalList = new ArrayList<COAAccount>(dataCoa);
Iterator<COAAccount> itertrMap=valueList.iterator();
while(itertrMap.hasNext()){
int s=-1;
COAAccount importCoa=new COAAccount();
importCoa=restTemplate.postForObject("http://localhost:8080/SaveIt/stock/getCopyBudget", itertrMap.next(),COAAccount.class);
switch (importCoa.getAccPerId()) {
case 0: s =9;
break;
case 1: s=10;
break;
case 2: s=11;
break;
case 3: s=0;
break;
case 4: s=1;
break;
case 5: s=2;
break;
case 6: s=3;
break;
case 7: s=4;
break;
case 8: s=5;
break;
case 9: s=6;
break;
case 10:s=7;
break;
case 11:s=8;
break;
default:
break;
}
COAAccount impCAcct=new COAAccount();
impCAcct=finalList.get(s);
impCAcct.setBudBrk(importCoa.getiD(), importCoa.getBudID(), importCoa.getAccPerId(), importCoa.getBudgetAmount(), importCoa.getDescAdd());
finalList.set(s, impCAcct);
}
brkVwMap.put(key,finalList);
}
}
这里 brkDBMap 和 brkVwMap 是 hashmap。我需要将列表添加到 brkVwMap。如果我想将键 1 和 2 的值“Account1”和“Account2”分别插入到 brkVwMap,那么在添加“Account2”后,地图变为{1=[Account2], 2=[Account2]} 而不是 {1=[Account1], 2=[Account2]}
【问题讨论】:
-
键是相同的还是不同的?
-
键不同。首先我用键 1 加值。然后我用键 2 加值,但这会导致 1 的值字段也发生变化
-
对于初学者,请使用泛型并格式化您的代码。
-
@KJEjava48 itDB里面的内容是什么?
-
map.computeIfAbsent(key, k-> new ArrayList<>()).add(value);怎么样?