我正在尝试编写一个java程序来迭代多级hashmap。例如,我有
一个HashMap <String, Object>
,其中Object可以是另一个HashMap<String, Object>
。
此hashmap的级别可以是n(&gt; 5)。
有人能给我一个关于如何在java中编写它的提示吗? java提供了一些实用工具吗?
由于
答案 0 :(得分: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 :(得分:2)
在不了解程序性质的情况下,以下是使用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%正确的语法,只需从内存中输入。
答案 2 :(得分:0)
您可以先检查object
的类型是否为HashMap
,然后检查其length
是否包含更多内容。
答案 3 :(得分: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());
}
}
}
为了尽可能简单,我不会删除每个键开头的.
。
答案 4 :(得分:0)
当您具有n级深度时,最好使用递归,当我的地图深度级别大于3时,我会遇到相同的问题。下面是对我有用的解决方案。
private void mapIterator(Map<String, Object> map) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getValue() instanceof Map) {
mapIterator((Map<String, Object>) entry.getValue());
} else {
//your logic goes here.
System.out.println(entry.getKey()+" : "+ entry.getValue());
}
}
}