为了账号安全,请及时绑定邮箱和手机立即绑定

设置嵌套在地图中的地图的值

设置嵌套在地图中的地图的值

杨__羊羊 2023-06-14 16:28:53
在我的一个项目中,我尝试在传递给参数的嵌套地图中设置值并返回更新的地图。问题是:假设我不知道地图结构,如何在嵌套地图的给定路径中设置值?我试图做到这一点。我试图递归调用set方法但无济于事,该方法没有返回 {age=1, human={lives=3, deaths=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);    }
查看完整描述

2 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

添加所有缺失的中间映射的版本更简单:


    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());

      Object newValue;

      if (nextKeys.size() == 0) {

        newValue = value;

      } else if (!map.containsKey(key)) {

        newValue = setNested(new LinkedHashMap<>(), nextKeys, value);

      } else {

        newValue = setNested((Map<String, Object>) map.get(key), nextKeys, value);

      }

      Map<String, Object> copyMap = new LinkedHashMap<>(map);

      copyMap.put(key, newValue);

      return copyMap;

    }


查看完整回答
反对 回复 2023-06-14
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

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


      }

    }

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


查看完整回答
反对 回复 2023-06-14
  • 2 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信