2010-12-01 5 views
2

Java에서 개체가 HashMap<String, Object>HashMap<String, Object>을 검색하려고합니다.HashMaps 탐색의 HashMap

주어진 키를 사용하여 찾을 수있는 HashMap<String, Object> 또는 키를 찾을 수없는 경우 null을 반환하는 재귀 함수를 구현했습니다. 그것은 첫 번째 항목에 대한 작동

public static HashMap<String, Object> getHashMap(HashMap<String, 
             Object> map, String key) 
{ 
    for (Map.Entry<String, Object> entry : map.entrySet()) { 
    if (entry.getValue().getClass().getName() == "java.util.HashMap") { 
     if (entry.getKey() == key) 
      return (HashMap<String, Object>) entry.getValue(); 
     return getHashMap((HashMap<String, Object>) entry.getValue(), key); 
    } 
    } 
    return null; 
} 

: 여기

는 기능입니다. HashMaps의 Hashmap을 어떻게 트래버스합니까? 더 나은 접근 방법은 무엇입니까?

+2

당신이 객체가'HashMap' 있는지 확인하려면 HashMap' instanceof를'객체를 사용 : 다음 key를 검색 할 수 있습니다, 당신의 '외부'의 HashMap에 대한 사용 HashMap<String, HashMap<String, Object>> main 시도 그런 이름은 매우 나쁜 생각입니다. 특히 잘못하고 있기 때문에 (equals를 사용해야합니다.) 그럼에도 불구하고, 어떤 것이 'HashMap'인지 특별히 신경 쓰면 안된다. Map 만 구현하면 충분하다. – ColinD

+0

조언 해 주셔서 감사합니다. 나는 그것을 수정했다! –

답변

1

:

당신이 null없는 경우 먼저 확인, 만 다음을 반환 할
return getHashMap((HashMap<String, Object>) entry.getValue(), key); 

. 그렇지 않으면 검색을 계속해야합니다.

HashMap<String, Object> result = getHashMap((HashMap<String, Object>) entry.getValue(), key); 
if (result != null) 
    return result; 
+0

정말 고마워요. 나는 그 점을 보지 못했습니다. 지금은 매력처럼 작동합니다! –

1

문자열의 경우 ==을 사용하지 마십시오. 대신 equals 메소드를 사용하십시오.

또 다른 예로는 if (myObject instanceof java.util.Map) { ... }과 같은 instanceof를 선호합니다. 나중에이 맵을 변경하려는 경우지도가 HashMap 일 필요는 없습니다. 대신 바로 여기에 값을 반환

+1

설명 : 한 쌍의 문자열에서 ==를 사용하면 문자열이 메모리의 동일한 개체인지 여부를 확인합니다. a.equals (b)를 사용하면 문자열 a와 b가 정확히 같은 문자를 포함하는지 확인합니다. 대부분의 문자열 비교에 대해 .equals가 필요합니다. – DGH

+0

설명해 주셔서 감사합니다! –

0

또 다른 접근 방법입니다. 클래스를 비교 ...,

Object value = main.get(key); 
if (value == null) { 
    for (HashMap<String, Object> inner : main.values()) { 
     value = inner.get(key); 
     if (value != null) { 
      break; 
     } 
    } 
} 
+0

카사 블랑카의 대답은 꽤 잘됩니다. 귀하의 답변을 주셔서 감사합니다. –