我有以下哈希图
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的所有元素都将更新。
这些是屏幕
下面的元素哈希图
答案 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++;