java 递归处理树形结构数据
发布日期:2021-06-29 11:47:45
浏览次数:2
分类:技术文章
本文共 3296 字,大约阅读时间需要 10 分钟。
在实战开发中经常有树形菜单、树形目录等业务需求。在设计数据库时一般使用id<----->parentId的结构来做。本文简单介绍以递归方式处理树形数据。
package com.agileai.esb.smc.domain; import java.util.*; import net.sf.json.JSONArray; public class TreeBuilder { Listnodes = new ArrayList (); public TreeBuilder(List nodes) { super(); this.nodes= nodes; } /** * 构建JSON树形结构 * @return */ public String buildJSONTree() { List nodeTree = buildTree(); JSONArray jsonArray = JSONArray.fromObject(nodeTree); return jsonArray.toString(); } /** * 构建树形结构 * @return */ public List buildTree() { List treeNodes = new ArrayList (); List rootNodes = getRootNodes(); for (Node rootNode : rootNodes) { buildChildNodes(rootNode); treeNodes.add(rootNode); } return treeNodes; } /** * 递归子节点 * @param node */ public void buildChildNodes(Node node) { List children = getChildNodes(node); if (!children.isEmpty()) { for(Node child : children) { buildChildNodes(child); } node.setMenus(children); } } /** * 获取父节点下所有的子节点 * @param nodes * @param pnode * @return */ public List getChildNodes(Node pnode) { List childNodes = new ArrayList (); for (Node n : nodes){ if (pnode.getId().equals(n.getPid())) { childNodes.add(n); } } return childNodes; } /** * 判断是否为根节点 * @param nodes * @param inNode * @return */ public boolean rootNode(Node node) { boolean isRootNode = true; for (Node n : nodes){ if (node.getPid().equals(n.getId())) { isRootNode= false; break; } } return isRootNode; } /** * 获取集合中所有的根节点 * @param nodes * @return */ public List getRootNodes() { List rootNodes = new ArrayList (); for (Node n : nodes){ if (rootNode(n)) { rootNodes.add(n); } } return rootNodes; } public static class Node { private String id; private String pid; private String text; private String url; private List menus; public Node() {} public Node(String id, String pid, String text, String url) { super(); this.id =id; this.pid =pid; this.text =text; this.url =url; } public String getId() { return id; } public void setId(String id) { this.id =id; } public String getPid() { return pid; } public void setPid(String pid) { this.pid =pid; } public String getText() { return text; } public void setText(String text) { this.text =text; } public String getUrl() { return url; } public void setUrl(String url) { this.url =url; } public List getMenus() { return menus; } public void setMenus(List menus) { this.menus= menus; } } public static void main(String[] args) { List nodes = new ArrayList (); Node p1 = new Node("01", "","01", ""); Node p6 = new Node("02", "","02", ""); Node p7 = new Node("0201", "02","0201", ""); Node p2 = new Node("0101", "01","0101", ""); Node p3 = new Node("0102", "01","0102", ""); Node p4 = new Node("010101", "0101","010101", ""); Node p5 = new Node("010102", "0101","010102", ""); Node p8 = new Node("03", "","03", ""); nodes.add(p1); nodes.add(p2); nodes.add(p3); nodes.add(p4); nodes.add(p5); nodes.add(p6); nodes.add(p7); nodes.add(p8); TreeBuilder treeBuilder = new TreeBuilder(nodes); System.out.println(treeBuilder.buildJSONTree()); } }
转载地址:https://blog.csdn.net/zzchances/article/details/115316739 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月16日 02时38分31秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
@EnableDiscoveryClient
2019-04-29
查看docker的端口映射情况
2019-04-29
Sentinel入门
2019-04-29
Sentinel的blockHandler与fallback的区别
2019-04-29
幂等性
2019-04-29
RPC和Restful深入理解
2019-04-29
layui.table.render设置自定义高度高度
2019-04-29
为nginx反向代理设置自定义错误页面
2019-04-29
Unity之C#学习笔记(0):环境配置与上手 HelloWorld
2019-04-29
高并发高可用秒杀系统(一)
2019-04-29
Three.js Example 注解 —— canvas_sandbox.html
2019-04-29
Three.js Example 注解 —— css3d_panorama.html
2019-04-29
Three.js Example 注解 —— css3d_sandbox.html
2019-04-29
Three.js Example 注解 —— css3d_youtube.html
2019-04-29
Three.js Example 注解 —— misc_uv_tests.html
2019-04-29