Обновление определенного значения hashmap, содержащего hashmap в Java - PullRequest
0 голосов
/ 29 августа 2018

У меня есть externalMap, который содержит innerMap для каждого полученного ключа. Сначала все innerMap одинаковы (здесь они содержат {1 = 1}. Я хочу изменить значение одной определенной внутренней карты для определенного ключа.

Вот мой код:

public class HelloWorld
{
  public static void main(String args[]){

        HashMap<String, HashMap<String, Integer>> outerMap = new HashMap<String, HashMap<String, Integer>>();
        HashMap<String, Integer> innerMap = new HashMap<String, Integer>();

        outerMap.put("1001",innerMap);
        outerMap.put("1002",innerMap);
        outerMap.put("1003",innerMap);

            innerMap.put("1", 1);

 //My attempt to change only one innermap;

            Map<String, Integer> map_to_change = outerMap.get("1001");
            map_to_change.put("1", 0);

//And then I print them to see if it's working;

            for(Map.Entry map  :  outerMap.entrySet() )

        {
            System.out.println(map.getKey()+" "+map.getValue());

        }
    }
}

Однако, вывод здесь

1003 {1=0}
1002 {1=0}
1001 {1=0}

Что показывает, что мой код изменяет все внутренние карты, а не только ту, которая связана с ключом "1001". Что я могу сделать?

1 Ответ

0 голосов
/ 29 августа 2018

Вы указываете на тот же innerMap объект в outerMap,

outerMap.put("1001",new HashMap<String, Integer>());//create separate maps
outerMap.put("1002",new HashMap<String, Integer>());
outerMap.put("1003",new HashMap<String, Integer>());

HashMap<String, Integer> innerMap =outerMap.get("1001");//get the map you want to put value
innerMap.put("1", 1);//assign the value

Обновление:
Если вы хотите сохранить копию Map, которую вы уже создали, вы можете скопировать и создать из нее новую Map, используя метод putAll,

outerMap.put("1001",copyMap(innerMap));
outerMap.put("1002",copyMap(innerMap));
outerMap.put("1003",copyMap(innerMap));

copyMap метод выглядит,

private static HashMap<String, Integer> copyMap(HashMap<String, Integer> innerMap){
    HashMap<String, Integer> copiedInnerMap = new HashMap<String, Integer>();
    copiedInnerMap.putAll(innerMap);
    return copiedInnerMap;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...