加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – N级映射的递归合并

发布时间:2020-12-15 05:21:31 所属栏目:Java 来源:网络整理
导读:有没有办法在 Java中深入合并地图?我已经看过一些关于它的帖子,但大多数似乎解决方案似乎只处理一个级别的合并或者是乏味的. 我的数据结构(使用JSON字符串表示地图)看起来类似于: { name: "bob",emails: { home: "bob@home.com",work : "bob@work.com" } }
有没有办法在 Java中深入合并地图?我已经看过一些关于它的帖子,但大多数似乎解决方案似乎只处理一个级别的合并或者是乏味的.

我的数据结构(使用JSON字符串表示地图)看起来类似于:

{ name: "bob",emails: { home: "bob@home.com",work : "bob@work.com" } }

理想情况下,如果我有另一张地图

{ emails: { home2: "bob@home2.com" } }

与第一张地图合并后会看起来像

{ name: "bob",work : "bob@work.com",home2: "bob@home2.com } }

我可以保证我的所有地图都是< String,Object>.这是否有开箱即用的解决方案?我真的想避免自己为非常嵌套或大的对象编写一堆递归或迭代代码.

解决方法

改进版: this gist

这是一种深度合并Java Maps的方法:

// This is fancier than Map.putAll(Map)
private static Map deepMerge(Map original,Map newMap) {
    for (Object key : newMap.keySet()) {
        if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) {
            Map originalChild = (Map) original.get(key);
            Map newChild = (Map) newMap.get(key);
            original.put(key,deepMerge(originalChild,newChild));
        } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) {
            List originalChild = (List) original.get(key);
            List newChild = (List) newMap.get(key);
            for (Object each : newChild) {
                if (!originalChild.contains(each)) {
                    originalChild.add(each);
                }
            }
        } else {
            original.put(key,newMap.get(key));
        }
    }
    return original;
}

适用于嵌套地图,对象和对象列表.请享用.

(免责声明:我不是Java开发人员!)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读