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_
相关产品推荐
相关产品推荐

