2015-01-09 4 views
2

다중 레벨 해시 맵에 대해 반복 할 Java 프로그램을 작성하려고합니다. 예를 들어 은 HashMap <String, Object>이고 Object는 다른 HashMap<String, Object>이 될 수 있습니다.중첩 된 (다중 레벨) 해시 맵 반복 처리

이 해시 맵의 레벨은 n (> 5) 일 수 있습니다.

누군가 내게 자바로 쓰는 방법에 대한 힌트를 줄 수 있습니까? 자바는 유틸리티를 제공합니까?

감사

+0

재귀에 익숙합니까? 이런 유형의 문제가 필요할 것입니다 : http://examples.javacodegeeks.com/core-java/java-recursion-example/ – Brian

답변

0

당신은 length가 있는지 여부를 더 내용을 확인 여부를 다음 object의 유형이 HashMap 여부를 확인하여 시작할 수 있습니다.

public void printAll(HashMap<String, Object> map) { 
    for (Object o : map.values()) { 
    if (o instanceof HashMap) { 
     printAll((HashMap<String, Object>) o); 
    } else { 
     System.out.println(o.toString()); 
    } 
    } 
} 

방금 ​​메모리에서 입력, 100 % 올바른 구문되지 않을 수 있습니다 : 프로그램의 성격에 대해 아무것도 모른 채

1

는 여기에 해시 맵과 재귀의 일반적인 예이다.

+1

'printAll (map);은'printAll (o);'이어야합니다. 'printAll'은'HashMap '를 기대하고 있기 때문에 캐스팅합니다. – Pshemo

+0

네, 맞아, 고마워. – Brian

4
public void iterate(Map<String, Object> map) { 
    for (Map.Entry<String, Object> entry : map.entrySet()) { 
     System.out.println("Key is: " + entry.getKey()); 
     if (entry.getValue() instanceof Map) { 
      System.out.println("Map found, digging further"); 
      iterate((Map<String, Object>) entry.getValue()); 
     } else { 
      System.out.println("Leaf found, value is: " + entry.getValue()); 
     } 
    } 
} 

이것은 깊이 우선 반복을 수행합니다. 그러나 java는 강력한 형식의 언어이므로 중첩 해시 맵과 다른 유형은 일반적으로 좋은 아이디어가 아닙니다. 대부분의 경우 해킹과 관련없는 솔루션이 있습니다.

+1

네, 이런 종류의 문제 때문에 나무를 좀 사용하는 것이 좋습니다. 그것은 훨씬 더 performatic 될 것입니다! – Leonardo

+3

니스. "Leaf found, value is :", entry.getValue()가 아니라 entry.getKey()를 의미하지 않습니까? – Brian

+0

고마워요, 고쳐주세요. –

0

@David Frank의 천둥을 훔치는 것이 아닙니다. 반대로, 나는 그에게 모든 신용을주고있다. 다음은 플랫 출력지도를 얻을 것이라고 자신의 코드를 통해 약간의 수정이있는 점으로 구분 keySet :

public void iterate(String currentKey, Map<String, Object> map, Map<String, String> out) { 
    for (Map.Entry<String, Object> entry : map.entrySet()) { 
     if (entry.getValue() instanceof Map) { 
      iterate(currentKey + "." + entry.getKey(), (Map<String, Object>) entry.getValue(), out); 
     } else { 
      out.put(currentKey + "." + entry.getKey(), entry.getValue().toString()); 
     } 
    } 
} 

내가 각각의 시작 부분에 .을 제거 아니에요, 가능한 한 간단하게하려면 키.