2015-01-09 107 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()); 
     } 
    } 
} 

为了保持尽可能简单,我不是在每个月初移除.键。