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 {                   List
nodes = 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:软件设计师--关键路径,最早开始时间,最晚开始时间,可以耽误的时间(可以晚几天出发而不影响整体)
下一篇:java8的stream和lamda获取list集合中的某几个字段组成新的list

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月16日 02时38分31秒