TreeUtil 数据库菜单生成无限级树形结构


1、项目需求:

    从数据库从加载所有的菜单出来,菜单中有 

id,parentId,name字段

   希望能有一个工具帮我进行树形结构重组;


  实例类:

package com.lming.chcservice.util;

import lombok.Data;

import java.util.List;
@Data
public class TreeNode {
    /**
     * 节点id
     */
    private String id;
    /**
     * 父节点 默认0为根节点
     */
    private String parentId;
    /**
     * 节点名称
     */
    private String name;
    /**
     * 是否有子节点
     */
    private boolean hasChild;

    public TreeNode(String id, String parentId, String name) {
        this.id = id;
        this.parentId = parentId;
        this.name = name;
    }
}

工具类:

package com.lming.chcservice.util;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 树形结构工具类
 *
 * 将一组list对象转成树形结构
 * 该list需符合设定的字段类型
 *
 */
public class TreeUtil {


    public static Map mapArray = new LinkedHashMap();

    public List menuCommon;
    public List list = new ArrayList();

    public List treeMenu(List menu){
        this.menuCommon = menu;
        for (TreeNode treeNode : menu) {
            Map mapArr = new LinkedHashMap();
            if(treeNode.getParentId().equals("0")){
                setTreeMap(mapArr,treeNode);
                list.add(mapArr);
            }
        }
        return list;
    }

    public List menuChild(String id){
        List lists = new ArrayList();
        for(TreeNode a:menuCommon){
            Map childArray = new LinkedHashMap();
            if(a.getParentId() .equals(id)){
               setTreeMap(childArray,a);
               lists.add(childArray);
            }
        }
        return lists;
    }

    private void setTreeMap(Map mapArr,TreeNode treeNode){
        mapArr.put("id", treeNode.getId());
        mapArr.put("name", treeNode.getName());
        mapArr.put("parentId", treeNode.getParentId());
        List childrens = menuChild(treeNode.getId());
        if(childrens.size()>0){
            mapArr.put("hasChild",true);
        }
        else{
            mapArr.put("hasChildren",false);
        }
        mapArr.put("childrens", menuChild(treeNode.getId()));
    }

    public  static void main(String[] args){

        List treeNodeList = new ArrayList<>();
        TreeNode treeNode1 = new TreeNode("1","0","首页");
        TreeNode treeNode2 = new TreeNode("2","0","订单");
        TreeNode treeNode3 = new TreeNode("3","1","预约");
        TreeNode treeNode4 = new TreeNode("4","2","捐献");
        TreeNode treeNode5 = new TreeNode("5","4","我的订单");
        TreeNode treeNode6 = new TreeNode("6","5","个人中心");
        TreeNode treeNode7 = new TreeNode("7","6","个人中心2");
        TreeNode treeNode8 = new TreeNode("8","99","个人中心3");
        treeNodeList.add(treeNode1);
        treeNodeList.add(treeNode6);
        treeNodeList.add(treeNode5);
        treeNodeList.add(treeNode3);
        treeNodeList.add(treeNode4);
        treeNodeList.add(treeNode2);
        treeNodeList.add(treeNode7);
        treeNodeList.add(treeNode8);


        TreeUtil treeUtil = new TreeUtil();
        System.out.print(JsonUtil.toJson(treeUtil.treeMenu(treeNodeList)));

    }


}

测试结果:
[
  {
    "id": "1",
    "name": "首页",
    "parentId": "0",
    "hasChild": true,
    "childrens": [
      {
        "id": "3",
        "name": "预约",
        "parentId": "1",
        "hasChildren": false,
        "childrens": []
      }
    ]
  },
  {
    "id": "2",
    "name": "订单",
    "parentId": "0",
    "hasChild": true,
    "childrens": [
      {
        "id": "4",
        "name": "捐献",
        "parentId": "2",
        "hasChild": true,
        "childrens": [
          {
            "id": "5",
            "name": "我的订单",
            "parentId": "4",
            "hasChild": true,
            "childrens": [
              {
                "id": "6",
                "name": "个人中心",
                "parentId": "5",
                "hasChild": true,
                "childrens": [
                  {
                    "id": "7",
                    "name": "个人中心2",
                    "parentId": "6",
                    "hasChildren": false,
                    "childrens": []
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]




 实力类不一致怎么办? 自己写一个实体转换类,将类的对象属性转换成上面的实体类,然后在调用,当然最快的方式直接修改实体类即可用。

参考: https://segmentfault.com/a/1190000011428318


 

你可能感兴趣的:(Java,SpringBoot)