Записи хеш-карты заменяются при добавлении новой пары ключ-значение

1

Я должен добавить некоторые данные списка в 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]}

  • 0
    Ключи одинаковые или разные?
  • 0
    ключи разные. Сначала я добавляю значение с помощью ключа 1. затем я добавляю значение с помощью ключа 2, но это также приводит к изменению поля значения 1
Показать ещё 6 комментариев
Теги:
list
hashmap

2 ответа

2
Лучший ответ
brkVwMap.put(key,finalList);

Значение, которое вы добавляете на свою карту, является finalList, который инициализируется:

//finalList=new ArrayList<COAAccount>();
finalList=dataCoa;

Вы не dataCoa где инициализируется dataCoa, но я подозреваю, что он был инициализирован один раз, поэтому все значения на вашей карте будут идентичны.

Строка, которую вы прокомментировали, имеет больше смысла. Если вы хотите инициализировать finalList содержимым dataCoa, но все равно иметь разные значения для разных ключей карты, вы должны написать:

finalList = new ArrayList<COAAccount>(dataCoa);
  • 0
    Я инициализирую dataCoa, и он также содержит некоторое значение. Я не показывал его в этом коде
  • 0
    @ KJEjava48 Я уверен, что вы инициализировали его, но, поскольку вы используете один и тот же объект в качестве значения в вашей карте для нескольких ключей, изменение значения одного ключа изменяет значение для всех остальных ключей.
Показать ещё 2 комментария
0

С 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;

Вторая строка, конечно, должна быть прокомментирована/удалена, иначе вы перезаписываете новый список с той же ссылкой, что раньше делали проблемы;)

  • 0
    Тем не менее у меня есть та же проблема после исправления

Ещё вопросы

Сообщество Overcoder
Наверх
Меню