标题:Java 中使用递归构建嵌套字符串路径的层级 Map 结构

发布时间 - 2026-01-28 00:00:00    点击率:

本文介绍如何将点号分隔的字符串(如 "caso.responsavel.dadospessoais.nome")解析为深度嵌套的 `map` 层级结构,并通过递归填充与格式化打印实现树状分组效果。

在 Java 开发中,常需将扁平化的路径字符串(如数据库字段映射、JSON 路径或 DTO 属性路径)转换为直观的层级结构,便于可视化、权限控制或动态表单生成。本方案不依赖第三方库,仅用原生 HashMap 与递归逻辑,即可将一维字符串数组转化为多层嵌套的 Map

核心思路是:对每个路径字符串按 "\\." 拆分为节点数组(如 "caso.responsavel.nome" → ["caso", "responsavel", "nome"]),再逐层递归插入到嵌套 Map 中——若当前层级键不存在,则新建子 Map 并挂载;若已存在,则继续向下递归处理后续节点。

以下是完整可运行示例:

import java.util.*;

public class NestedPathGrouping {

    public static void main(String[] args) {
        String[] array = {
            "caso.id",
            "caso.unidadeDoCaso.id",
            "caso.etiqueta",
            "caso.sigiloso",
            "caso.idPecaSegredoJustica",
            "caso.numeroAno",
            "caso.numero",
            "caso.competencia.id",
            "caso.competencia.ativo",
            "caso.competencia.nome",
            "caso.responsavel.id",
            "caso.responsavel.dadosPessoais.nome",
            "caso.escrivao.id",
            "caso.escrivao.dadosPessoais.nome"
        };

        Map root = new HashMap<>();
        for (String path : array) {
            String[] nodes = path.split("\\.");
            fill(root, nodes, 0);
        }

        print(root, "");
    }

    // 递归填充嵌套 Map
    public static void fill(Map map, String[] nodes, int i) {
        if (i >= nodes.length) return;

        String key = nodes[i];
        Object existing = map.get(key);

        if (existing == null) {
            // 当前节点不存在,创建新子 Map 并挂载
            Map childMap = new HashMap<>();
            map.put(key, childMap);
            fill(childMap, nodes, i + 1);
        } else if (existing instanceof Map) {
            // 当前节点已存在且为 Map,继续向下填充
            @SuppressWarnings("unchecked")
            Map childMap = (Map) existing;
            fill(childMap, nodes, i + 1);
        }
        // 若 existing 非 Map(如已被设为终端值),此处可抛异常或忽略——本例中所有叶子均为无值占位(仅键存在)
    }

    // 递归打印,支持缩进层级可视化
    public static void print(Map map, String indent) {
        for (String key : map.keySet()) {
            System.out.println(indent + key);
            Object value = map.get(key);
            if (value instanceof Map) {
                print((Map) value, indent + "   ");
            }
        }
    }
}

关键注意事项:

  • 类型安全增强:fill() 方法中显式检查 existing instanceof Map,避免强制类型转换异常(原答案中 (Map)(node) 存在严重逻辑错误,已修正为正确递归逻辑);
  • 终端节点语义清晰:本实现中,所有叶子节点(如 "id"、"

    nome")均作为空子 Map 的键存在,不存储实际值;如需存储原始路径或附加元数据,可扩展 Object 值为自定义类(如 NodeValue);
  • ⚠️ 不可变性提示:该结构为可变嵌套 Map,若需线程安全,请在外层包装 Collections.synchronizedMap() 或改用 ConcurrentHashMap(注意:嵌套子 Map 仍需手动同步);
  • ? 扩展建议:如需反向生成所有完整路径(如 "caso.responsavel.dadosPessoais.nome"),可在 fill() 中增加路径累积参数,或单独实现 flatten(Map, String prefix) 方法。

该方案简洁、高效、无外部依赖,完美契合 Java 8+ 环境下的动态路径建模需求,是 Stream API 无法直接覆盖场景下的优雅补充。


# java  # js  # json  # node  # ai  # stream  # 字符串数组  # red  # String  # Object  # 字符串  # 强制类型转换  # 递归  # 线程  # map  # 类型转换  # 数据库  # 不存在  # 如需  # 已被  # 设为  # 均为  # 请在  # 树状  # 可在  # 自定义 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  详解jQuery中基本的动画方法  油猴 教程,油猴搜脚本为什么会网页无法显示?  网站制作企业,网站的banner和导航栏是指什么?  如何用好域名打造高点击率的自主建站?  PHP正则匹配日期和时间(时间戳转换)的实例代码  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  如何破解联通资金短缺导致的基站建设难题?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何在IIS7上新建站点并设置安全权限?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  如何在建站主机中优化服务器配置?  zabbix利用python脚本发送报警邮件的方法  历史网站制作软件,华为如何找回被删除的网站?  如何在云服务器上快速搭建个人网站?  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  高防服务器如何保障网站安全无虞?  WEB开发之注册页面验证码倒计时代码的实现  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  如何在腾讯云服务器快速搭建个人网站?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  如何制作一个表白网站视频,关于勇敢表白的小标题?  制作企业网站建设方案,怎样建设一个公司网站?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何获取免费开源的自助建站系统源码?  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Bootstrap整体框架之JavaScript插件架构  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Laravel怎么为数据库表字段添加索引以优化查询  制作电商网页,电商供应链怎么做?  网站优化排名时,需要考虑哪些问题呢?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  高防服务器租用首荐平台,企业级优惠套餐快速部署