迭代嵌套(多级)hashmap

时间:2015-01-09 00:39:12

标签: java

我正在尝试编写一个java程序来迭代多级hashmap。例如,我有 一个HashMap <String, Object>,其中Object可以是另一个HashMap<String, Object>

此hashmap的级别可以是n(&gt; 5)。

有人能给我一个关于如何在java中编写它的提示吗? java提供了一些实用工具吗?

由于

5 个答案:

答案 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());
        }
    }
}