首页 > 代码库 > 使用Map辅助拼装树状结构,消除递归调用
使用Map辅助拼装树状结构,消除递归调用
目前菜单或其他树状结构在数据库中的存储,多数是以一个parentid作为关联字段,以一维形式存储。
使用时全部查询出来,然后在内存中拼装成树状结构。现在主要涉及的是拼装方法的问题。
一般可以进行 递归调用来实现 过程如下:
1.首先找到根节(s)点即没有上级节点的元素
2.根据找到的节点的id,遍历数据,查看parentid为此id的元素 将其 放到此元素的childlist中去
3.对此元素的childlist 重复步骤2
2-3这个步骤的重复 一般通过递归来实现。
我采用的方法,是使用map作为辅助,只做一层循环,但增加判断条件
这个方法之前在别的地方也有用过,不过没有记录下来。
节点类:
1 class Node{2 String nodeNo;3 String parentNodeNo;4 Set<Node> childNodes;5 }
方法直接贴代码
1 //数据源为sourceList 此时所有的ChildNodes里都是空的 并没有被拼成树状 2 List<Node> listToTree(List <Node> sourceList){ 3 //1.先准备一个数组 用于存储根节点(s) 准备一个Map用于存储节点的子元素列表 4 5 List<Node> rootNodes= new ArrayList<Node>(); 6 Map<String, Set<Node>> childNodesMap= new HashMap<String, Set<Node>>(); 7 8 //2.唯一的一层循环 9 for (Node node: sourceList) {10 //3.查看Map中是否有子此Node的子元素列表 没有则创建11 if (childNodesMap.get(node.getNodeNo()) == null) {12 childNodesMap.put(privilege.getNodeNo(), new HashSet<Node >());13 }14 //4.将childNodes赋值给此Node 15 node.setChildre(childNodesMap.get(node.getNodeNo()));16 //5.如果此Node是根Node则放到根列表中去17 if (node.getParentNodeNo() == null) {18 rootNodes.add(node);19 }20 if (node.getParentNodeNo() != null) {21 //6.查看此Node的ParentNode的 ChildNodes是否存在 没有则创建22 if (childNodesMap.get(node.getParentNodeNo()) == null) {23 childNodesMap.put(node.getParentNodeNo(), new HashSet<Node >());24 }25 //7.将此节点 添加到ParentNodes的ChildNodes中26 childNodesMap.get(node.getParentNodeNo()).add(node);27 }28 }29 return rootNodes;30 }
使用Map辅助拼装树状结构,消除递归调用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。