Java Hashmap установить один элемент обновить все элементы - PullRequest
2 голосов
/ 29 апреля 2019

У меня есть следующая хэш-карта

Map<String, List<KmsRealesBeanAgrupado> > listadoAgrupado = new HashMap<String , List<KmsRealesBeanAgrupado> >();

У меня есть цикл для обновления каждого элемента hashmap, но когда я обновляю один элемент hashmap по индексу, все элементы с этим индексом обновляются

Это код

  for (Map.Entry<String,List<KmsRealesBeanAgrupado>> elemento1 : listadoAgrupado.entrySet()){  
                listado2 = elemento1.getValue();
                String clave = elemento1.getKey();
                for (KmsRealesBeanAgrupado  elemento : listado2){

                    listaKms = elemento.getListado();
                    listaKms = anadirTotales(listaKms,vista);
                    listadoAgrupado.get(clave).get(j).setListado(listaKms);
                    //elemento.setListado(listaKms);

                    //listado2.get(j).setListado(elemento.getListado());
                }
                j++;

Когда я выполню

listadoAgrupado.get(clave).get(j).setListado(listaKms); 

обновляются все элементы с индексом j в хэш-карте.

Это экран

enter image description here

Следующий элемент hashmap

enter image description here

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Вы обновляете весь список здесь:

listaKms = anadirTotales(listaKms,vista)

, поскольку List<KmsRealesBeanAgrupado>> является типом ссылки, поэтому, когда вы устанавливаете значение в типе ссылки, оно обновляет значение в хэш-карте.

Попробуйте использовать это:

    for (Map.Entry<String,List<KmsRealesBeanAgrupado>> elemento1 : listadoAgrupado.entrySet()){  
            listado2 = elemento1.getValue();
            String clave = elemento1.getKey();
            for (KmsRealesBeanAgrupado  elemento : listado2){

                listaKms = elemento.getListado();
                //listaKms = anadirTotales(listaKms,vista);
                //don't manipulate listaKms otherwise it will get reflected in hashmap
                  List<KmsRealesBeanAgrupado>> lap = anadirTotales(listaKms,vista);
                listadoAgrupado.get(clave).get(j).setListado(lap);
                //elemento.setListado(listaKms);

                //listado2.get(j).setListado(elemento.getListado());
            }
            j++;
0 голосов
/ 29 апреля 2019

Странный код. У меня нет четкого ответа, но только некоторые замечания по вашему коду. Надеюсь, это поможет вам понять, где ваша проблема.

listadoAgrupado.get(clave) совпадает с listado2. В вашем внутреннем цикле for вы проходите через все элементы listado2, выполняете некоторые вычисления и затем сохраняете обновленный listaKms в элементе KmsRealesBeanAgrupado в позиции j того же списка listado2. Таким образом, вы всегда обновляете один и тот же экземпляр KmsRealesBeanAgrupado (по индексу j). listadoAgrupado.get(clave).get(j) всегда ссылается на один и тот же элемент списка. Вы действительно этого хотите?

У нас нет кода anadirTotales. Возвращает ли это другой список или обновляет список входных параметров. В случае, если он просто обновляется, вы должны установить его позже.

j увеличивается во внешнем цикле. При выполнении итерации по de map на первой итерации все вычисления будут помещены в первый элемент списка listadoAgrupado.get("key1"). На второй итерации все вычисления будут помещены во второй элемент списка listadoAgrupado.get("key2").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...