前言

在树形结构的数据中,经常会有构建树、根据某节点向上生成树,根据某节点向下生成树的需求,这些都可以使用递归方法实现,递归方法这里不进行赘述,如有需要,请自行百度。个人觉得递归性能较差,可控性也不强,特此发表个博客记录一下,此博客是根据某节点向上生成树形结构,如果需要构建整棵树或都根据某个节点向下生成树,可以移步至我的另一篇博客附上链接:https://blog.csdn.net/qq_38516524/article/details/122046824

实现原理

以菜单为例,创建一个Map,key为菜单Id,value为菜单对象,重点为创建Map开始,之前的代码均为处理数据,可忽略,开始一个while循环,找到当前菜单的父级菜单,将当前菜单赋给父级菜单,然后将当前菜单的引用改为父级菜单,将parentId变更为父菜单的父菜单,当满足跳出条件后,返回的就是最终结果了。

实现代码

public AppMenuTree queryUp(String menuCode) {// 获取数据List<AppMenuWithBLOBs> menuList = getMenuList();// 类型转换List<AppMenuTree> menuTreeList = menuList.stream().map(menu -> {AppMenuTree temMenu = new AppMenuTree();BeanUtils.copyProperties(menu, temMenu);return temMenu;}).collect(Collectors.toList());// 过滤目标AppMenuTree appMenu = menuTreeList.stream().filter(menu -> menuCode.equalsIgnoreCase(menu.getMenuCode())).findFirst().orElse(new AppMenuTree());// 创建Map,key为idMap<Integer, AppMenuTree> menuMap = menuTreeList.stream().collect(Collectors.toMap(AppMenuTree::getAmeId, menu -> menu, (m1, m2) -> m2));Integer parentId = appMenu.getParentId();AppMenuTree resMenu = null;// 设置循环次数,防止死循环int count = 0;while (true) {// 跳出条件if (parentId.equals(-1) || count > 10000) {break;}resMenu = menuMap.get(parentId);// 找到父级菜单,将当前菜单赋值给父菜单的子属性resMenu.setChild(ListUtil.toList(appMenu));appMenu = resMenu;parentId = resMenu.getParentId();count++;}return resMenu;
}

PS.跳出条件需要根据自己的情况设置,这里设置了一个变量来限制它的循环次数,防止死循环。


树形结构根据某一节点向上生成树(无递归)相关推荐

  1. php 递归栏目名叠加,thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,thinkphp递归...

    thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,thinkphp递归 本文实例讲述了thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法.分享给大家供大家参考,具体如下: 这 ...

  2. Java封装树形结构(任意父节点)

    直接上代码,比如封装组织树形结构: @Service public class TestService{public List<DepTreeDto> treeDept() {//查询列表 ...

  3. php buildtrees,thinkphp5带分组功能的树形结构的无限级分类节点展示

    -- -- 表的结构 `h_group` -- CREATE TABLE IF NOT EXISTS `h_group` ( `id` smallint(3) unsigned NOT NULL AU ...

  4. ElementUI 树形结构默认展示某个节点

    分别通过default-expanded-keys和default-checked-keys设置默认展开和默认选中的节点.需要注意的是,此时必须设置node-key,其值为节点数据中的一个字段名,该字 ...

  5. js tree树形结构,通过子节点找到所有父节点

    /* * array-树形数据 * targetId-目标id * valueKey-用来判断的字段名 * childrenKey-子元素字段名 **/ findPatentValue(array, ...

  6. 在不知道根节点的情况下生成树形结构 (采用JSONObject)

    废话不多说直接上代码 /*** * 生成树形结构 在不知道跟节点的情况下* @param list 源数据* @param nodeList 跟节点数据* @param childName 子节点名称 ...

  7. NET平台下Web树形结构程序设计

    .NET平台下Web树形结构程序设计 李洪根 我的上篇文章<树形结构在开发中的应用>主要是在Windows Form下的实现,下面讲一下Web Form下的实现. 概述 TreeView是 ...

  8. Java后端递归构建树形结构

    记录:在Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示. 简明:为了简化代码,引入Lombok的Jar包,可省略实体类set().get()方法. <dep ...

  9. java 通用扁平数据转换成树形结构

    大家好,我是入错行的bug猫.(http://blog.csdn.net/qq_41399429,谢绝转载) 所谓树形结构,就是上级节点中,包含若干子节点,然后子节点中又包含其子节点,一般是没有层级次 ...

最新文章

  1. 英特尔在移动芯片为何衰败 看完此文豁然开朗
  2. EasyUI中ToolTip提示框的简单使用
  3. Neutron中的Service类
  4. TikZ绘图示例——尺规作图: 圆内接任意正边形的近似画法(以正七边形为例)
  5. 负压电源设计 TPS54160 负压 Level Shifting Control for an Inverting Buck-boost
  6. jDBC连接mysql数据库的5种方式
  7. (Hopcroft-Carp二分图匹配)Rain on your Parade
  8. 如何使CAD打印PDF显示清楚
  9. vim的安装以及基础使用方法;
  10. 分机计算机怎么设置共享打印机,win7打印机共享设置分机怎么设置
  11. 【毕业设计】基于单片机的墨水屏阅读器(单词卡) - 物联网 嵌入式
  12. 站内通知 java组件,spring-aop组件详解——Advice通知
  13. VMware虚拟机解决空间不足,增加磁盘空间(磁盘扩容)
  14. 爬取中国天气网的天气预报,可视化展示看着就是爽【python爬虫入门进阶】(06)
  15. 电子电路设计基本概念100问(三)【学习目标:原理图、PCB、阻抗设计、电子设计基本原则、基本原器件等】
  16. php创建数组教程,PHP 数组
  17. leetcode526 优美的排列
  18. 基于ICE方式SIP信令穿透Symmetric NAT技术研究
  19. 数据指标 | 网站数据分析体系
  20. 关于修改linux系统的DNS

热门文章

  1. 用python写一个16进制转换文本字符串
  2. 32u图腾服务器机柜型号,图腾网络机柜-G36632-32U1.6米机柜
  3. STM32之视频播放器(AVIJPEG)
  4. 论社会信任网络中货币的债权属性和关于去中心化货币网络协议的建议
  5. Python图形界面开发框架常用的八款工具包
  6. 统一数据交换(UDX)
  7. 运用计算机技术创设英语课堂问题场,如何运用信息化技术手段优化英语课堂.docx...
  8. D-Link DIR-859的RCE漏洞 CVE-2019–17621
  9. 去哪儿网机票搜索系统的高并发架构设计(要点节选)
  10. macOS 常驻桌面便利贴应用