首页 > 解决方案 > 设置嵌套在地图中的地图的值

问题描述

在我的一个项目中,我尝试在传递给参数的嵌套映射中设置值并返回更新的映射。问题是:假设我不知道地图结构,如何在嵌套地图的给定路径中设置值

我试图做到这一点。我尝试递归调用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);
    }

标签: javahashmapnested

解决方案


我看不出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);

      }
    }

注意:此方法可以在最低级别的映射中插入新键,但不能在中间映射中。


推荐阅读