这篇文章介绍了如何利用Java编写树结构算法,特别是动态路由的实现。该篇文章的核心代码就是 buildTree() 方法,可以根据输入的节点集合(treeNodes)构建树形结构,并返回根节点集合(result)。

该方法的实现非常简单,其主要思想是将节点集合转换为节点映射表,然后遍历节点映射表,如果找到了父节点,则将该节点添加到父节点的子节点列表中。如果没有找到父节点,则说明该节点为根节点(或者是孤立的节点),将其添加到结果集中。这个实现过程中,利用了泛型接口 TreeNode 来为不同类型的节点提供统一的抽象接口,这很好地体现了Java语言的面向对象特性。

总的来说,这篇文章对Java树结构的解析进行了详尽的介绍,给读者提供了一个很好的参考。特别是对于那些需要使用树形结构的开发者来说,这篇文章提供了一个通用的实现方法,可以最大程度地减少代码的重复率和出错率。

/*** 构建树节点* 先检查节点的pid是否为0,如果是,就将其添加到结果列表中。否则,查找节点的父节点,如果父节点不为空,就将当前节点添加为父节点的子节点。*/
public static <T extends TreeNode<T>> List<T> buildTree(List<T> treeNodes) {List<T> result = new ArrayList<>();Map<Integer, T> nodeMap = new LinkedHashMap<>(treeNodes.size());for (T treeNode : treeNodes) {nodeMap.put(treeNode.getId(), treeNode);}for (T node : nodeMap.values()) {if (node.getPid() == 0) {result.add(node);} else {T parent = nodeMap.get(node.getPid());if (parent != null) {parent.getChildren().add(node);}}}return result;
}

其中,TreeNode是一个泛型接口,可以定义如下:

public interface TreeNode<T> {Integer getId();Integer getPid();List<T> getChildren();
}

然后,PermMenuRuleVoPermAdminGroupVo可以实现TreeNode接口,如下:

public class PermMenuRuleVo implements TreeNode<PermMenuRuleVo> {private Integer id;private Integer pid;private List<PermMenuRuleVo> children = new ArrayList<>();// 省略getter和setter
}public class PermAdminGroupVo implements TreeNode<PermAdminGroupVo> {private Integer id;private Integer pid;private List<PermAdminGroupVo> children = new ArrayList<>();// 省略getter和setter
}

使用这个方法时,只需要将菜单节点的集合或角色节点的集合作为参数传入即可,例如:

List<PermMenuRuleVo> menuNodes = getMenuNodes();
List<PermMenuRuleVo> menuTree = buildTree(menuNodes);List<PermAdminGroupVo> adminGroupNodes = getAdminGroupNodes();
List<PermAdminGroupVo> adminGroupTree = buildTree(adminGroupNodes);

java树结构Tree生成相关推荐

  1. Linux - tree 生成目录树「Note」

    概览 tree 安装 tree 可选参数 tree 常用参数 win 配置 tree 安装 #Debian apt-get install tree#Ubuntu apt-get install tr ...

  2. Java使用itext生成Pdf

    Java使用itext生成Pdf 背景 所需依赖 解决jpedal-lgpl jar包问题 示例代码 生成带图片的PDF(使用本地文件系统图片) 生成带图片的PDF(使用网络图片) 背景 在某些业务场 ...

  3. Java短连接生成工具-思路

    Java短连接生成工具-思路-这里只是模拟一下 package com.csrs.trans.shorturl;import java.util.HashMap; import java.util.M ...

  4. java cxf服务端代码_【JAVA】 cxf 生成 webservice 服务端代码

    CXF Apache CXF = Celtix + XFire.CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding . ...

  5. gen文件下有两个R.java_gen目录无法更新,或者gen目录下的R.JAVA文件无法生成

    gen目录无法更新,或者gen目录下的R.JAVA文件无法生成 1.gen目录的用处 android gen目录下的R.java并不是由用户创建,而是android工程本身将android的资源进行自 ...

  6. Java根据正则生成随机字符串

    regex="^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$" 调研了下,目前有5种开源工具: ①import ...

  7. java对象实例_深入理解Java对象实例生成的例子!(转)

    深入理解Java对象实例生成的例子!(转)[@more@]代码如下: class A { public int Avar; public A() { System.out.println(" ...

  8. java图形验证码生成工具类

    转载自   java图形验证码生成工具类 生成验证码效果       ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java ...

  9. java代码自动生成的插件_如何使用插件生成自定义Java 8代码

    java代码自动生成的插件 大多数程序员讨厌的一件事就是编写样板代码. 无休止的时间花费在设置实体类和配置数据库连接上. 为了避免这种情况,您可以让Speedment Open Source之类的程序 ...

最新文章

  1. New Phytologist:王建军等综述全球变化下的山地微生物组和生态系统功能
  2. druid读取hdfs文件
  3. Packer创建阿里云本地镜像
  4. C语言:--位域和内存对齐
  5. python autohotkey_PyAutoGUI-python版的autoit/AHK
  6. python新浪微博爬虫_利用新浪API实现数据的抓取\微博数据爬取\微博爬虫
  7. 如何寻找竞争情报发挥企业优势
  8. 详解Spring Ioc(控制反转)
  9. canvas实现图片旋转
  10. 天池比赛TASK3打卡
  11. sql的一些简单查询
  12. YOLOv3目标检测算法——通俗易懂的解析
  13. win10怎么将计算机放桌面壁纸,win10电脑系统怎么改变桌面壁纸的大小
  14. 计算机教师继续教育心得,教师继续教育学习心得体会范文(精选8篇)
  15. 教你快速打出左角括号、右角括号「」(直角括号)
  16. oracle CLOB与BLOB的区别及使用
  17. 2022.07.16模拟赛总结
  18. linux 文件唯一标识符,详解Linux中获取全球唯一标示符UUID的方法
  19. addweek oracle_Oracle数据库常用语法
  20. Python 语言中的 “鸭子类型”

热门文章

  1. linux 面试题全面总结(持续更新)
  2. c# 骰子作画实现 图片转字符
  3. – 8、查询没学过“张三“老师授课的同学的信息
  4. linux系统怎么做备份吗,备份Linux操作系统的几种方法
  5. mysql双机热备_mysql双机热备实现方案
  6. 【Spring心得】xmlns=“http://www.spring 和 xmlns:beans=“http://www.spring 差之毫厘谬以千里
  7. SpringBoot实践(三十二):5分钟搭建springboot单体应用开发框架
  8. python爬虫软件-3款你必须知道的爬虫工具
  9. ubuntu 使用集显显示,使用独显计算
  10. hvt lvt svt的cell泄露功耗的原因