目前菜单或其他树状结构在数据库中的存储,多数是以一个parentid作为关联字段,以一维形式存储。
使用时全部查询出来,然后在内存中拼装成树状结构。现在主要涉及的是拼装方法的问题。

一般可以进行 递归调用来实现 过程如下:
1.首先找到根节(s)点即没有上级节点的元素 
2.根据找到的节点的id,遍历数据,查看parentid为此id的元素 将其 放到此元素的childlist中去
3.对此元素的childlist 重复步骤2

2-3这个步骤的重复 一般通过递归来实现。

我采用的方法,是使用map作为辅助,只做一层循环,但增加判断条件
这个方法之前在别的地方也有用过,不过没有记录下来。

节点类:

 class Node{
String nodeNo;
String parentNodeNo;
Set<Node> childNodes;
}

方法直接贴代码

        //数据源为sourceList  此时所有的ChildNodes里都是空的 并没有被拼成树状
List<Node> listToTree(List <Node> sourceList){
//1.先准备一个数组 用于存储根节点(s) 准备一个Map用于存储节点的子元素列表 List<Node> rootNodes= new ArrayList<Node>();
Map<String, Set<Node>> childNodesMap= new HashMap<String, Set<Node>>(); //2.唯一的一层循环
for (Node node: sourceList) {
//3.查看Map中是否有子此Node的子元素列表 没有则创建
if (childNodesMap.get(node.getNodeNo()) == null) {
childNodesMap.put(privilege.getNodeNo(), new HashSet<Node >());
}
//4.将childNodes赋值给此Node
node.setChildre(childNodesMap.get(node.getNodeNo()));
//5.如果此Node是根Node则放到根列表中去
if (node.getParentNodeNo() == null) {
rootNodes.add(node);
}
if (node.getParentNodeNo() != null) {
//6.查看此Node的ParentNode的 ChildNodes是否存在 没有则创建
if (childNodesMap.get(node.getParentNodeNo()) == null) {
childNodesMap.put(node.getParentNodeNo(), new HashSet<Node >());
}
//7.将此节点 添加到ParentNodes的ChildNodes中
childNodesMap.get(node.getParentNodeNo()).add(node);
}
}
return rootNodes;
}

使用Map辅助拼装树状结构,消除递归调用的更多相关文章

  1. java File类 打印目录树状结构(递归)

    import java.io.File; /** * 递归遍历 * */ public class FieTree { public static void main(String[] args) { ...

  2. js List<Map> 将偏平化的数组转为树状结构并排序

    数据格式: [ { "id":"d3e8a9d6-e4c6-4dd8-a94f-07733d3c1b59", "parentId":&quo ...

  3. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

  4. java集合树状结构及源码

    java集合树状结构及源码 最近一直想看一下java集合的源码,毕竟平时用的比较多,但总是感觉是跟着习惯new出来一个对象,比如ArrayList,HashMap等等,所以就简单的看了一下,了解了一下 ...

  5. 将lits集合转化为树状结构

    一,bean的类型: public class DeptListRES { /** * 子节点 */ private List<DeptListRES> children; private ...

  6. openerp学习笔记 对象间关系【多对一(一对一)、一对多(主细结构)、多对多关系、自关联关系(树状结构)】

    1.多对一(一对一)关系:采购单与供应商之间的关系 'partner_id':fields.many2one('res.partner', 'Supplier', required=True, sta ...

  7. 原生JS实现树状结构列表

    树状结构列表,这个技术点之前有写过了,是基于vue讲解,但似乎都没有解决痛点,最基础的原生JS该怎么实现呢? 这篇文章会全面详细的介绍树状结构列表的实现,从数据处理成树状结构,到动态生成dom节点渲染 ...

  8. 根据租户id获取部门树状结构有父子结构的数据list

    /** * 根据租户id获取部门树状结构 * @param tenantId * @return */ @GetMapping("getDeptTreeList") public ...

  9. 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限

    大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...

随机推荐

  1. jqgrid使用简单记录

    我要为id为jqGrid的table使用jqgrid插件. $("#jqGrid").jqGrid({ url: 'data/test.json', mtype: "GE ...

  2. mybatis generator 使用

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. 正则表达式_matches(Regex)

    [0-9a-zA-Z.%+-] 匹配中括号中的 0-9 或者 a-z 或者 A-Z 或者 . 或者 % 或者 + 或者 - $p = "111,222,333"$p -match ...

  4. Splay Tree的删除操作

    Splay Tree的插入操作,搜索操作,和删除操作都实现了,那么就能够使用来解题了. 指针的删除操作的处理还是那么难的,非常多坎须要避开. 同一个坎还是坑了我好多次,就是指针传递的问题,什么时候须要 ...

  5. 玩转Android之加速度传感器的使用,模仿微信摇一摇

    Android系统带的传感器有很多种,最常见的莫过于微信的摇一摇了,那么今天我们就来看看Anroid中传感器的使用,做一个类似于微信摇一摇的效果. OK ,废话不多说,我们就先来看看效果图吧: 当我摇 ...

  6. iOS应用审核的通关秘籍

    磨刀不误砍柴工.作为手机应用开发者,你需要向应用商店提交应用审核,迅速通过审核可以让你抢占先机.对苹果iOS应用开发者来说尤其如此.苹果应用商店的审核近乎吹毛求疵,下面这些清单可以让你知道苹果会在哪些 ...

  7. magento 常用方法集锦

    1,获得store的配置变量 Mage::getStoreConfig('sectionname/groupname/fields'); 1 Mage::getStoreConfig('section ...

  8. Mac下sublime text 的“package control”安装

    小伙伴们好,我根据昨晚的经历写一个小总结:关于“Mac下sublime text 的“package control”安装”.本来安装package control是一个无比简单的事情,即使是初次使用 ...

  9. css placeholder 颜色设置

    因为每个浏览器的CSS选择器都有所差异,所以需要针对每个浏览器做单独的设定(可以在冒号前面写input和textarea). ::-webkit-input-placeholder { /* WebK ...

  10. JQ 如何设置单选按钮问题

    <input type="radio" name="db_12" value="2" checked="checked/&g ...