2

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

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

在我的脚本中的某个时刻,我想将“thirdKey”集迭代为其自己的地图。是否有用于隔离“嵌套”HashMap 并将其用作自己的一维映射的通用约定?

4

4 回答 4

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;
}

正如 Vikdor 已经说过的,我认为这没有真正的惯例。

编辑: 当然,您也可以将键和值写入新的 Map (“展平”它)。我只是将值添加到列表中,因为这样当嵌套映射之一使用已经存在的键时,您就不会遇到问题。

于 2012-08-27T14:15:18.117 回答
3

没有我知道的约定。您必须回退以instanceof查看键处的值是否为 a Map,如果是,则对其进行特殊处理-在您的情况下是递归的。

于 2012-08-27T14:13:43.630 回答
1

我怀疑是否会有一个使用泛型的“共同约定”。最好转向强类型程序,不要使用 Object 作为 hashmap 的键或值。然后不会遇到这种情况,并且会有更多有组织的数据定义。我的两分钱!

于 2012-08-27T14:10:43.260 回答
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;
}
于 2017-07-21T09:33:25.840 回答