You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中合并含相同键的嵌套Map的实现方法

合并三层嵌套Map的实现方案

嘿,要把data2合并到data1里其实不难,核心思路就是逐层遍历嵌套的Map结构,对每一层的键做检查:如果data1里没有这个键,直接把data2对应的value放进去;如果已经存在,就继续深入下一层做合并。

下面给你两种实现方式,按需选择:

一、手动逐层合并(适合固定三层结构)

这种方式简单直接,专门针对你这个固定的三层嵌套Map写的,代码清晰,容易理解:

// 遍历data2的第一层键(Integer类型)
for (Map.Entry<Integer, Map<String, Map<String, Object>>> entry1 : data2.entrySet()) {
    Integer key1 = entry1.getKey();
    Map<String, Map<String, Object>> value1 = entry1.getValue();
    
    // 检查data1里有没有当前第一层的键
    if (!data1.containsKey(key1)) {
        // 没有的话直接把整个第二层Map放进去
        data1.put(key1, value1);
    } else {
        // 有的话,取出data1对应的第二层Map,继续合并
        Map<String, Map<String, Object>> data1Level2 = data1.get(key1);
        // 遍历data2的第二层键(String类型)
        for (Map.Entry<String, Map<String, Object>> entry2 : value1.entrySet()) {
            String key2 = entry2.getKey();
            Map<String, Object> value2 = entry2.getValue();
            
            // 检查data1的第二层Map里有没有当前键
            if (!data1Level2.containsKey(key2)) {
                data1Level2.put(key2, value2);
            } else {
                // 如果第三层Map也有需要合并的键值对(比如同一个key2下有不同的键),就合并第三层
                Map<String, Object> data1Level3 = data1Level2.get(key2);
                // 把data2第三层的所有键值对加进去,已存在的键会被覆盖(如果想保留原有的,先判断再put就行)
                data1Level3.putAll(value2);
            }
        }
    }
}

拿你给的测试数据跑一遍:

  • 初始data1是{'xxx':{'x':{'abc':'xyz'}}}
  • data2是{'xxx':{'y':{'cde':'xyz'},'z':{'cde':'xyz'}}}
    运行完上面的代码,data1就会变成你想要的{'xxx':{'x':{'abc':'xyz'},'y':{'cde':'xyz'},'z':{'cde':'xyz'}}},完全符合需求。

二、递归通用合并方法(支持任意层数的嵌套Map)

如果以后你的嵌套层数可能变,或者想复用这个合并逻辑,可以写个递归的通用方法,自动处理任意深度的嵌套Map:

public static void mergeNestedMaps(Map<?, ?> dest, Map<?, ?> src) {
    for (Map.Entry<?, ?> entry : src.entrySet()) {
        Object key = entry.getKey();
        Object srcValue = entry.getValue();
        Object destValue = dest.get(key);
        
        if (destValue instanceof Map && srcValue instanceof Map) {
            // 两边都是Map类型,递归往下合并
            mergeNestedMaps((Map<?, ?>) destValue, (Map<?, ?>) srcValue);
        } else {
            // 不是Map的话,直接把src的值放到dest里(如果想保留dest原有值,加个!dest.containsKey(key)判断就行)
            dest.put(key, srcValue);
        }
    }
}

用的时候直接调用就行:

mergeNestedMaps(data1, data2);

这个方法不管嵌套几层都能处理,非常灵活。要是遇到同一键对应的不是Map,src的值会覆盖dest的;如果想保留dest原来的值,把else分支改成if (!dest.containsKey(key)) dest.put(key, srcValue);就可以了。

小补充

  • 如果你的业务里,第三层Map有相同的键时需要保留data1原来的值,那在合并第三层的时候记得用putIfAbsent或者先判断键是否存在再put,别直接用putAll覆盖。
  • 上面的代码都是Java的,要是你用其他语言(比如Python),思路完全一样,只是语法不同,核心都是逐层遍历+判断合并。

内容的提问来源于stack exchange,提问作者learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:42:10