Nested Hashmap обновляет все значения для всех ключей вместо того, которое я хочу изменить - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть hashmap, который содержит 10 дочерних hashmap, каждый из этих 5 дочерних hashmap сопоставляется с массивом String.Когда я хочу обновить значение для конкретного ключа из дочернего хеш-карты, вместо этого обновляются все ключи;не только это, но и все дочерние хэш-карты также обновляются.Этот код иллюстрирует то, что я делаю.

HashMap<String, HashMap<String, String[]>> parentMap = new HashMap<String, HashMap<String, String[]>>();

for(String x : someArray){ // Adds 10 children hashmaps to parentMap
    parentMap.put(x,new HashMap<String, String[]>());
    for(String y : someOtherArray){ // Creates 5 keys for each of the children hashmaps
        parentMap.get(x).put(y,stringArray);
    }
}

parentMap.get(someKey).put(someOtherKey,modifiedArray); // This updates the entry I want to update.

Когда я обновляюсь с помощью этой последней инструкции, я хочу обновить именно этот ключ, однако вместо этого все обновляется, обновляются все ключи для всех дочерних хэш-картвместо того, который я хочу.

Надеюсь, это имеет смысл, я не уверен, что это правильный подход для этого, но я искал в Интернете какие-нибудь советы о том, как сделать что-то подобное без удачи.Я не очень хорош с Java, если я смогу достичь того же результата с помощью чего-то более простого, это будет приветствоваться, обратите внимание, что я не могу использовать List или что-то в этом роде, так как он использует индексы int, мне нужно сослатьсяк моим объектам, используя строку (например, словарь на Python).

Ответы [ 2 ]

5 голосов
/ 02 ноября 2011

Это потому, что вы инициализируете все карты, содержащие stringArray, т. Е. один и тот же массив .

Именно поэтому изменение одной из них изменит все их.

Если вы хотите, чтобы каждый ключ в каждой внутренней карте указывал на разные копии массива, вам нужно сделать что-то вроде

...
    parentMap.get(x).put(y, Arrays.copyOf(stringArray, stringArray.length));
                            ^^^^^^^^^^^^^^           ^^^^^^^^^^^^^^^^^^^^^
...

(вы также можете использовать, например,clone или создавайте новые массивы вручную каждый раз, когда вам нужна новая копия.)

0 голосов
/ 02 ноября 2011

@ aioobe объяснил причину.

Вот решение.Вам нужно создавать копию исходного массива каждый раз, когда вы помещаете его на карту:

String[] tmpArr = new String[stringArray.length];
arraycopy(stringArr, 0, tmpArr, 0, stringArray.length);
parentMap.get(x).put(y,stringArray);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...