Java Hashmap设置一个元素更新所有元素

时间:2019-04-29 09:04:07

标签: java hashmap

我有以下哈希图

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

下面的元素哈希图

enter image description here

2 个答案:

答案 0 :(得分:0)

奇怪的代码。我没有一个明确的答案,但是您的代码上只有一些备注。希望它可以帮助您了解问题所在。

listadoAgrupado.get(clave)listado2相同。 在内部for循环中,遍历listado2的所有元素,进行一些计算,然后将更新的listaKms存储在KmsRealesBeanAgrupado元素中相同位置的j列出listado2。因此,您始终要更新相同的KmsRealesBeanAgrupado实例(在索引j处)。 listadoAgrupado.get(clave).get(j)始终引用相同的列表元素。这真的是您想要的吗?

我们没有代码anadirTotales。这是返回其他列表还是更新输入参数列表。如果只是更新,则必须随后进行设置。

j在外部循环中增加。遍历地图时,在第一次迭代中,所有计算都将放在listadoAgrupado.get("key1")列表的第一个元素中。 在第二次迭代中,所有计算都将放在listadoAgrupado.get("key2")列表的第二个元素中。

答案 1 :(得分:0)

您要在此处更新整个列表:

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