You need to enable JavaScript to run this app. Java将点分隔键扁平Map转为嵌套Map仅保留最后一条记录的问题
优惠活动
大模型
产品
解决方案
定价
更多

Java将点分隔键扁平Map转为嵌套Map仅保留最后一条记录的问题

问题根源

你当前的代码每次处理单个键值对时,都会生成完整的独立嵌套Map结构,调用putAll方法时会直接覆盖根Map中相同顶级键的已有值,因此最终只会保留最后一个处理的键值对的结构,之前的全部被覆盖。

修复方案

处理每个层级的键时,优先复用已存在的Map结构,没有对应键时再新建Map,不要每次都完整生成新结构覆盖旧值。修改后的代码如下:

public void save() {
    try {
        Map<String, Object> datamap = new HashMap<>();
        for (String key : deepkeymap.keySet()) {
            Object value = deepkeymap.get(key);
            // 拆分点分隔的键为层级数组
            String[] keyLevels = key.split("\\.");
            Map<String, Object> currentLevel = datamap;
            // 遍历到倒数第二层,逐层创建/复用Map
            for (int i = 0; i < keyLevels.length - 1; i++) {
                String currentKey = keyLevels[i];
                // 对应键不存在或者值不是Map类型时,新建Map存入
                if (!currentLevel.containsKey(currentKey) || !(currentLevel.get(currentKey) instanceof Map)) {
                    currentLevel.put(currentKey, new HashMap<String, Object>());
                }
                // 进入下一层级继续处理
                currentLevel = (Map<String, Object>) currentLevel.get(currentKey);
            }
            // 最后一级存入实际值
            currentLevel.put(keyLevels[keyLevels.length - 1], value);
        }
        System.out.println("Datamap: " + datamap);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

验证说明

如果deepkeymap中存在多组同前缀的键值对,修改后的代码会将所有值合并到同一套嵌套结构中,不会出现覆盖丢失的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 00:15:01