Java技术求助:解析嵌套Map<?,?>生成含完整路径的Map<String,String>
解析嵌套Map生成路径-值映射的实现方案
核心思路
通过递归遍历嵌套的Map<?,?>结构,逐层拼接节点路径,当遍历到非Map类型的叶子节点时,将完整路径和对应值存入目标Map<String,String>中。路径采用点(.)作为层级分隔符,和你给出的示例格式一致。
Java实现代码
import java.util.HashMap; import java.util.Map; public class NestedMapFlattener { // 入口方法:接收原始嵌套Map,返回扁平化的路径-值映射 public static Map<String, String> flattenMap(Map<?, ?> inputMap) { Map<String, String> result = new HashMap<>(); // 初始路径为空,启动递归遍历 traverse(inputMap, "", result); return result; } // 递归遍历核心方法 private static void traverse(Map<?, ?> currentMap, String currentPath, Map<String, String> result) { for (Map.Entry<?, ?> entry : currentMap.entrySet()) { String key = entry.getKey().toString(); // 拼接当前层级路径:已有路径则加前缀点,否则直接用当前key String newPath = currentPath.isEmpty() ? key : currentPath + "." + key; Object value = entry.getValue(); // 判断当前值是否为嵌套Map,是则继续递归,否则存入结果 if (value instanceof Map<?, ?>) { traverse((Map<?, ?>) value, newPath, result); } else { result.put(newPath, value.toString()); } } } // 示例测试代码 public static void main(String[] args) { // 构建你给出的嵌套Map结构 Map<String, Object> testMap = new HashMap<>(); Map<String, Object> inputMap = new HashMap<>(); Map<String, Object> dataMap = new HashMap<>(); Map<String, Object> content1Map = new HashMap<>(); content1Map.put("value", "value1"); Map<String, Object> content2Map = new HashMap<>(); content2Map.put("value", "value2"); dataMap.put("content1", content1Map); dataMap.put("content2", content2Map); Map<String, Object> metaMap = new HashMap<>(); metaMap.put("metaContent", "content"); inputMap.put("data", dataMap); inputMap.put("meta", metaMap); testMap.put("test", inputMap); // 执行扁平化转换 Map<String, String> flattenedMap = flattenMap(testMap); // 打印结果 flattenedMap.forEach((k, v) -> System.out.printf("(\"%s\", \"%s\")%n", k, v)); } }
代码说明
- 入口方法
flattenMap:初始化结果容器,触发递归遍历流程。 - 递归方法
traverse:- 遍历当前Map的所有键值对,动态拼接层级路径。
- 遇到嵌套Map则递归深入,遇到叶子节点则将路径和值存入结果。
- 类型兼容:通过
toString()统一处理键和值的类型转换,适配Map<?,?>的泛型不确定性。
测试输出
运行main方法后,输出完全匹配你的预期:
("test.input.data.content1.value", "value1")
("test.input.data.content2.value", "value2")
("test.input.meta.metaContent", "content")
注意事项
- 若嵌套结构中存在数字、布尔值等非字符串叶子节点,
toString()会自动转换为对应字符串形式。 - 空输入Map会返回空结果,不会抛出异常。
内容的提问来源于stack exchange,提问作者LinebakeR
相关产品推荐
相关产品推荐

