java使用递归合并map,多层级

java的map有putAll来合并两个map,但是只能做到第一层的合并,如果多层级就不行,使用递归做一个合并map简单方法

to_map

{
	"a":"aaa",
	"b":"bbb",
	"c":{
		"c1":"ccc1",
		"c2":{
			"c11":"c1c1c1"
		},
		"c3":"ccc3"
	}
}

from_map

{
	"b":"bbb_new",
	"c":{
		"c1":"ccc1_new",
		"c3":{
			"c11":"c1c1c1"
		},
		"c4":"ccc4"
	},
	"d":"d_new"
}

合并后to_map的效果

{
    "a": "aaa",
    "b": "bbb_new",
    "c":
    {
        "c1": "ccc1_new",
        "c2":
        {
            "c11": "c1c1c1"
        },
        "c3":
        {
            "c11": "c1c1c1"
        },
        "c4": "ccc4"
    },
    "d": "d_new"
}

 java代码

public class Test {
    public static void mergeMap(Map<String, Object> to, Map<String, Object> from){
        Set<Map.Entry<String, Object>> entries = to.entrySet();
        Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Object> kv = iterator.next();
            String toKey = kv.getKey();
            Object toValue = kv.getValue();
            Object fromValue = from.get(toKey);
            if(fromValue != null){
                if(toValue instanceof Map){
                    Map<String, Object> childTo = (Map<String, Object>)toValue;
                    mergeMap(childTo, (Map<String, Object>) fromValue);
                }else{
                    to.put(toKey,fromValue);
                }
            }
        }

        Set<String> keys = from.keySet();
        for (String key : keys) {
            if (!to.containsKey(key)){
                to.put(key,from.get(key));
            }
        }
    }

    public static void main(final String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        Map to = objectMapper.readValue("{\"a\":\"aaa\",\"b\":\"bbb\",\"c\":{\"c1\":\"ccc1\",\"c2\":{\"c11\":\"c1c1c1\"},\"c3\":\"ccc3\"}}", Map.class);
        Map from = objectMapper.readValue("{\"b\":\"bbb_new\",\"c\":{\"c1\":\"ccc1_new\",\"c3\":{\"c11\":\"c1c1c1\"},\"c4\":\"ccc4\"},\"d\":\"d_new\"}", Map.class);
        mergeMap(to,from);
        System.out.println(objectMapper.writeValueAsString(to));;
    }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值