迭代嵌套(多维)hashmap

时间:2012-08-27 14:00:00

标签: java

当我在其上调用.toString()时,我有HashMap<String, Object>看起来像这样:

{somekey=false, anotherKey=someString, thirdKey={nestedKey=hello, nestedKey2=world,etc=etcetcetc}}

在我的脚本中的某个点,我想迭代“thirdKey”设置为它自己的地图。是否有一个共同的约定用于隔离“嵌套”的HashMap并将其用作自己的一维地图?

4 个答案:

答案 0 :(得分:6)

这是我的代码,用于递归提取地图中的所有值(以及这些地图中的地图)。

public List<Object> getValues(Map<String, Object> map) {

    List<Object> retVal = new ArrayList<Object>();

    for (Map.Entry<String, Object> entry : map.entrySet()) {
        Object value = entry.getValue();

        if (value instanceof Map) {
            retVal.addAll(getValues((Map) value));
        } else {
            retVal.add(value);
        }
    }

    return retVal;
}

正如维克多已经说过的那样,我认为没有真正的惯例。

修改 当然,您也可以将键和值写入新的Map(“展平”它)。我刚刚将值添加到List中,因为这样当其中一个嵌套映射使用已存在的键时,您不会遇到问题。

答案 1 :(得分:2)

没有我所知道的惯例。您必须回退到instanceof以查看密钥的值是否为Map,如果是 - 则以递归方式处理它。

答案 2 :(得分:1)

我怀疑是否会出现具有泛型的“共同约定”。最好转向强类型程序,而不是使用Object作为hashmap的键或值。然后将不会遇到此场景,并且会有更多有组织的数据定义。我的两分钱!

答案 3 :(得分:0)

public static Map<String, Object> flatten(Map<String, Object> map) {
    Map<String, Object> newMap = new HashMap<>();
    for (Entry<String, Object> entry : map.entrySet()) {
        if (entry.getValue() instanceof Map) {
            @SuppressWarnings("unchecked")
            Map<String, Object> tempMap = flatten((HashMap<String, Object>) entry.getValue());
            for (Entry<String, Object> tempEntry : tempMap.entrySet()) {
                newMap.put(entry.getKey()+"."+tempEntry.getKey(), tempEntry.getValue());
            }
        } else {
            newMap.put(entry.getKey(), entry.getValue());
        }
    }
    return newMap;
}