2011-11-02 3 views
2

저는 10 개의 자식 해시 맵을 포함하는 해시 맵을 갖습니다. 각 해시 맵은 키 배열로 매핑됩니다. 하위 해시 맵에서 특정 키의 값을 업데이트하려는 경우 모든 키가 대신 업데이트됩니다. 뿐만 아니라 모든 어린이 hashmap도 업데이트됩니다. 이 코드는 내가하고있는 것을 보여줍니다. 중첩 된 해시 맵은 변경하려는 키 대신 모든 키의 모든 값을 업데이트합니다.

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. 

내가 마지막 명령으로 업데이트

, 나는 특별히 그 키를 업데이트 할, 그러나 모든 HashMaps을 대신 내가 원하는 하나를 업데이트하는 모든 어린이를위한, 대신 모든 키를 업데이트됩니다.

잘하면이게 올바른 방법인지는 모르겠지만 온라인에서 행운이없이 비슷한 일을하는 것에 대한 조언을 찾고 있습니다. 나는 Java로는 전혀 좋지 않다. 같은 결과를 더 간단하게 얻을 수 있다면 환영 할 것이다. List 나 그와 비슷한 것을 사용할 수 없다. int 인덱스를 사용하기 때문에 참조 할 필요가있다. 파이썬에서 사전과 같은 문자열을 사용하여 내 객체에 연결합니다.

답변

5

모든지도를 stringArray, 즉 같은 배열을 포함하도록 초기화했기 때문입니다.

이 중 하나를 변경하면 모든 변경됩니다. 각 내부 맵에서 각 키 배열의 다른 사본를 가리 키도록하려면

, 당신은 또한 예를 clone 사용하거나 수동으로 새 배열을 만들 수 있습니다 (

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

같은 것을 할 필요가 새로운 사본이 필요할 때마다).

+0

감사 aioobe! 이게 내 문제를 해결했습니다! 나는 HashMaps가 이와 같이 행동한다는 생각을 가지고 있지 않았다. 그것은 나에게 C 포인터를 생각 나게한다. – xmc

0

@aioobe는 이유를 설명했습니다.

여기 해결책이 있습니다. 지도에 넣을 때마다 초기 배열 복사본을 만들어야합니다.

String[] tmpArr = new String[stringArray.length]; 
arraycopy(stringArr, 0, tmpArr, 0, stringArray.length); 
parentMap.get(x).put(y,stringArray); 
+0

시간 내 주셔서 감사합니다! 나는 어린이 hashmaps의 값을 업데이트 할 때 매우 비슷한 implentation을 사용하고 있습니다. – xmc

관련 문제