当我在其上调用 .toString() 时,我有一个HashMap<String, Object>
看起来像这样的:
{somekey=false, anotherKey=someString, thirdKey={nestedKey=hello, nestedKey2=world,etc=etcetcetc}}
在我的脚本中的某个时刻,我想将“thirdKey”集迭代为其自己的地图。是否有用于隔离“嵌套”HashMap 并将其用作自己的一维映射的通用约定?
当我在其上调用 .toString() 时,我有一个HashMap<String, Object>
看起来像这样的:
{somekey=false, anotherKey=someString, thirdKey={nestedKey=hello, nestedKey2=world,etc=etcetcetc}}
在我的脚本中的某个时刻,我想将“thirdKey”集迭代为其自己的地图。是否有用于隔离“嵌套”HashMap 并将其用作自己的一维映射的通用约定?
这是我从地图(以及这些地图中的地图)中递归提取所有值的代码。
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 (“展平”它)。我只是将值添加到列表中,因为这样当嵌套映射之一使用已经存在的键时,您就不会遇到问题。
没有我知道的约定。您必须回退以instanceof
查看键处的值是否为 a Map
,如果是,则对其进行特殊处理-在您的情况下是递归的。
我怀疑是否会有一个使用泛型的“共同约定”。最好转向强类型程序,不要使用 Object 作为 hashmap 的键或值。然后不会遇到这种情况,并且会有更多有组织的数据定义。我的两分钱!
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;
}