您的位置:首页 > 数据库

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

2017-11-24 01:51 495 查看
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<String,Object> mapArray = new LinkedHashMap<String, Object>();

public List<TreeNode> menuCommon;
public List<Object> list = new ArrayList<Object>();

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

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

private void setTreeMap(Map<String,Object> 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<TreeNode> 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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Tree menu list
相关文章推荐