Я должен добавить некоторые данные списка в hashmap, используя loop.Когда я добавлю второй список в 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. Если я хочу вставить значения "Account1" и "Account2" для ключей 1 и 2 соответственно в brkVwMap, то после добавления "Account2" карта станет {1 = [Account2], 2 = [Account2]} вместо {1 = [Account1], 2 = [Account2]}
brkVwMap.put(key,finalList);
Значение, которое вы добавляете на свою карту, является finalList
, который инициализируется:
//finalList=new ArrayList<COAAccount>();
finalList=dataCoa;
Вы не dataCoa
где инициализируется dataCoa
, но я подозреваю, что он был инициализирован один раз, поэтому все значения на вашей карте будут идентичны.
Строка, которую вы прокомментировали, имеет больше смысла. Если вы хотите инициализировать finalList
содержимым dataCoa
, но все равно иметь разные значения для разных ключей карты, вы должны написать:
finalList = new ArrayList<COAAccount>(dataCoa);
С finalList=dataCoa;
вы создаете мелкую копию, поэтому каждая ссылка, которую вы используете finalList (т.е. каждое значение в вашей HashMap), указывает на тот же список DataCoa и вы меняете dataCoa всякий раз, когда изменяете значение в finalList.
В качестве примера вы можете использовать что-то вроде этого:
List<String> a = new ArrayList<String>();
a.add("a");
List<String> b = a;
b.add("b");
List<String> c = new ArrayList<String>(a);
c.add("c");
System.out.println(a);
System.out.println(b);
System.out.println(c);
Таким образом, b - это тот же список, что и a, в то время как c - глубокая копия, где все элементы копируются в новый список, а изменения не отражаются на a и b. Результат:
[a, b]
[a, b]
[a, b, c]
Итак, Эран прав, говоря свой код
//finalList=new ArrayList<COAAccount>();
finalList=dataCoa;
должно быть:
finalList=new ArrayList<COAAccount>(dataCoa);
//finalList=dataCoa;
Вторая строка, конечно, должна быть прокомментирована/удалена, иначе вы перезаписываете новый список с той же ссылкой, что раньше делали проблемы;)