Одинаковые значения с разными ключами в хэш-карте - PullRequest
1 голос
/ 14 июля 2011

Изначально я поместил две записи с одинаковым значением в хэш-карту.Значение двух записей само по себе является картой.Эти записи имеют разные ключи.

Теперь я хочу поместить новые значения в карту (значение) первой записи.Проблема в том, что карта второй записи (ее значение) также изменяется, пока я меняю первую.Два разных ключа как-то ссылаются на одно и то же значение (map).

Что мне делать, чтобы редактировать значения изначально одинаковых значений отдельно друг от друга?

Ответы [ 2 ]

5 голосов
/ 14 июля 2011

По сути, проблема в том, что вы не поместили две карты в вашу карту, а вместо этого поместили две ссылки на одну и ту же карту.

Чтобы иметь две независимые версии внутренней карты во внешней, вам нужно сделать ее копию перед повторным размещением.

Вы должны быть в состоянии сделать копию HashMap, используя метод clone. Обратите внимание, что хотя вы получаете две разные карты, фактические значения на этих двух картах одинаковы. Это означает, что если содержимое скопированной карты изменчиво, и вы меняете их, они все равно изменятся в обоих местах.

уточнить:

HashMap<Object, Object> map1 = new HashMap<Object, Object>()// This is your original map.
map1.put("key", mutableObject)
HashMap<Object, Object> map2 = map1.clone();
map2.put("something", "something else");// map1 is unchanged
map2.get("key").change();// the mutable object is changed in both maps.
1 голос
/ 14 июля 2011

Хороший улов при размещении одной и той же ссылки под разными ключами.Однако для решения я бы не использовал метод clone, а скорее использовал бы явное копирование: package com.au.psiu;

import java.util.HashMap;
import java.util.Map;

public class NoIdea {

    public static void main(String... args) {
        Map source = new HashMap();

        //Insert value into source
        Map copy1 = new HashMap();
        copy1.putAll(source);
        Map copy2 = new HashMap();
        copy2.putAll(source);

        Map mapOfMaps = new HashMap();
        mapOfMaps.put("key1", copy1);
        mapOfMaps.put("key2", copy2);
        //...and you can update maps separately
    }
}

Также вы можете захотеть взглянуть на проект Google Guava - они имеютмного полезных API для коллекций.

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