java 递归处理树形结构数据

该博客介绍如何在Java中使用递归方法构建树形数据结构,特别是在处理如菜单和目录这样的业务需求时。文章通过一个名为`TreeBuilder`的类展示了如何从id<->parentId的关系中构建JSON树形结构,包括获取根节点、子节点以及构建整个树形结构的过程。
摘要由CSDN通过智能技术生成

在实战开发中经常有树形菜单、树形目录等业务需求。在设计数据库时一般使用id<----->parentId的结构来做。本文简单介绍以递归方式处理树形数据。

package com.agileai.esb.smc.domain;
 
 
 
import java.util.*;
 
import net.sf.json.JSONArray;
 
public class TreeBuilder {
 
        
 
         List<TreeBuilder.Node> nodes = new ArrayList<TreeBuilder.Node>();
 
 
 
         public TreeBuilder(List<Node> nodes) {
 
                   super();
 
                   this.nodes= nodes;
 
         }
 
        
 
         /**
          * 构建JSON树形结构
          * @return
          */
 
         public String buildJSONTree() {
 
                   List<Node> nodeTree = buildTree();
 
                   JSONArray jsonArray = JSONArray.fromObject(nodeTree);
 
                   return jsonArray.toString();
 
         }
 
        
 
         /**
          * 构建树形结构
          * @return
          */
 
         public List<Node> buildTree() {
 
                   List<Node>treeNodes = new ArrayList<Node>();
 
                   List<Node>rootNodes = getRootNodes();
 
                   for (Node rootNode : rootNodes) {
 
                            buildChildNodes(rootNode);
 
                            treeNodes.add(rootNode);
 
                   }
 
                   return treeNodes;
 
         }
 
        
 
         /**
          * 递归子节点
          * @param node
          */
 
         public void buildChildNodes(Node node) {
 
       List<Node> children = getChildNodes(node); 
 
       if (!children.isEmpty()) {
 
            for(Node child : children) {
 
                     buildChildNodes(child);
 
            } 
 
            node.setMenus(children);
 
       }
 
         }
 
 
 
         /**
          * 获取父节点下所有的子节点
          * @param nodes
          * @param pnode
          * @return
          */
 
         public List<Node> getChildNodes(Node pnode) {
 
                   List<Node>childNodes = new ArrayList<Node>();
 
                   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<Node> getRootNodes() {
 
                   List<Node>rootNodes = new ArrayList<Node>();
 
                   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<Node> 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<Node> getMenus() {
 
                            return menus;
 
                   }
 
                   public void setMenus(List<Node> menus) {
 
                            this.menus= menus;
 
                   }
 
         }
 
        
 
         public static void main(String[] args) {
 
                  
 
                   List<Node>nodes = new ArrayList<Node>();
 
                   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());
 
         }
 
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨两点钟同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值