2015-01-09 41 views
2

我正在嘗試編寫一個Java程序來遍歷多級散列映射。例如,我有 a HashMap <String, Object>,其中Object可以是另一個HashMap<String, Object>迭代嵌套(多級)散列映射

該散列表的級別可以是n(> 5)。

有人可以給我一個關於如何在java中編寫它的提示嗎? java提供了一些實用程序嗎?

感謝

+0

您是否熟悉遞歸?您將需要它來解決這類問題:http://examples.javacodegeeks.com/core-java/java-recursion-example/ – Brian

回答

0

您可以通過檢查的object類型是否是HashMap開始,然後檢查其是否length它有更多的內容或沒有。

1

不知道你的計劃的性質什麼,這裏是遞歸的一個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

'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是一種強類型語言,所以嵌套hashmaps和其他類型通常不是一個好主意。大多數情況下,有解決方案不涉及這種黑客行爲。

+1

是的,對於這種問題,我建議你使用一些樹。這將是更多的表演! – Leonardo

+3

不錯。對於「發現葉子,價值是:」,你不是指entry.getValue()而不是entry.getKey()? – Brian

+0

謝謝,修復它。 –

0

我不是故意偷@大衛弗蘭克的雷霆。相反,我給了他所有的榮譽。這是在他的代碼稍加修改,你會得到一個平坦的輸出地圖,包含點分隔的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()); 
     } 
    } 
} 

爲了保持儘可能簡單,我不是在每個月初移除.鍵。