java - 设置嵌套在地图中的地图的值
问题描述
在我的一个项目中,我尝试在传递给参数的嵌套映射中设置值并返回更新的映射。问题是:假设我不知道地图结构,如何在嵌套地图的给定路径中设置值?
我试图做到这一点。我尝试递归调用set方法但无济于事,该方法没有返回 {age=1, human={lives=3, death=2}},而是返回 {deaths=2} 或null
. 但是,请注意,这是我无数次尝试之一。
这是我的一种方法(其他方法已删除):
@SuppressWarnings("unchecked")
private static Map<Object, Object> setNested(YamlParser parser, List<String> paths, String key, Object value, Map<Object, Object> previousMap, int loops) {
Object found = parser.getObject(paths);
if (!(found instanceof Map))
return previousMap; // path is not nested
Map<Object, Object> theMap = (Map<Object, Object>) found;
theMap.put(key, value);
// .... ?
System.out.println(theMap);
return setNested(parser, paths, key, theMap, theMap, loops + 1);
}
解决方案
我看不出YamlParser
在这个例子中有什么好处,我也不知道你到底想做什么。我认为,这是关于制作一个新地图,其中中间地图和最终(叶子)地图已被复制,并且新的叶子地图具有新的价值。
如果这不是您所需要的,您可以自由修改它。也许它会提示您如何实现自己的方法:
public class Test {
private static Map<String, Object> setNested(Map<String, Object> map, List<String> keys, Object value) {
String key = keys.get(0);
List<String> nextKeys = keys.subList(1, keys.size());
if (nextKeys.size() == 0) {
Map<String, Object> copyMap = new LinkedHashMap<>((Map) map);
copyMap.put(key, value);
return copyMap;
} else if (!map.containsKey(key)) {
return map;
} else {
Map<String, Object> copyMap = new LinkedHashMap<>((Map) map);
Map<String, Object> nextMap = (Map<String, Object>) map.get(key);
copyMap.put(key, setNested(nextMap, nextKeys, value));
return copyMap;
}
}
public static void main(String[] args) {
Map<String, Object> map1 = new LinkedHashMap<>();
Map<String, Object> map2 = new LinkedHashMap<>();
map2.put("lives", 3);
map2.put("deaths", 2);
map1.put("age", 1);
map1.put("human", map2);
System.out.println(map1);
map1 = setNested(map1, Arrays.asList("human", "deaths"), 7);
System.out.println(map1);
}
}
注意:此方法可以在最低级别的映射中插入新键,但不能在中间映射中。
推荐阅读
- python - 当我在 pycharme 中运行 python 程序时出现烧瓶错误
- c# - RestSharp 中的错误请求,但正在使用 Postman
- python - 在 Python 中计算百分比
- python - 从管道读取——有状态或无状态
- sql-server - 在 SQL Server 中使用多个子查询重新创建访问查询
- python - 迭代数组的每个元素
- google-maps - 颤振谷歌地图。展现风格。我怎样才能得到这个工作?
- java - TestNg 硒化物。没有 webdriver 绑定到当前线程
- c# - U-SQL 获取字符串的最后 3 个字母
- react-native - Jest expo 找不到转换属性 - 缺少assetFileTransformer.js 文件