树状数据结构


1、前言

  1. 如我们常见的数据库的菜单, 省市区, 权限通过父ID进行关联, 处理成树状数据返回至前端
  2. 代码地址: https://gitee.com/xmaxm/test-code/tree/master/chaim-special-data/src/main/java/com/chaim/special/data/menu


2、预处理数据

menuParentId关联父ID

[
MenuBO(id=1547414817916182529, menuParentId=0, name=商品管理, level=1, type=1),
MenuBO(id=1547414920685019137, menuParentId=0, name=订单管理, level=1, type=1),
MenuBO(id=1547414986762084353, menuParentId=1547414817916182529, name=商品列表, level=2, type=1),
MenuBO(id=1547415070325202945, menuParentId=1547414817916182529, name=商品分组, level=2, type=1),
MenuBO(id=1547415128978350082, menuParentId=1547414986762084353, name=添加, level=3, type=2),
MenuBO(id=1547415281852342273, menuParentId=1547414986762084353, name=删除, level=3, type=2)
]


3、期望得到数据结构

转换为树数据结构

[{
	"id": 1547414817916182529,
	"name": "商品管理",
	"menuVOList": [{
		"id": 1547414986762084353,
		"name": "商品列表",
		"menuVOList": [{
			"id": 1547415128978350082,
			"name": "添加",
			"menuVOList": []
		}, {
			"id": 1547415281852342273,
			"name": "删除",
			"menuVOList": []
		}]
	}, {
		"id": 1547415070325202945,
		"name": "商品分组",
		"menuVOList": []
	}]
}, {
	"id": 1547414920685019137,
	"name": "订单管理",
	"menuVOList": []
}]


5、示列代码

MenuData.java:

package com.chaim.special.data.menu;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

//@formatter:off
/**
 * 菜单数据(常见三级数据, 比如菜单, 权限, 类型等等, 需要处理成树结构数据)
 *
 * 源数据:
 *      [
 *      MenuBO(id=1547414817916182529, menuParentId=0, name=商品管理, level=1, type=1),
 *      MenuBO(id=1547414920685019137, menuParentId=0, name=订单管理, level=1, type=1),
 *      MenuBO(id=1547414986762084353, menuParentId=1547414817916182529, name=商品列表, level=2, type=1),
 *      MenuBO(id=1547415070325202945, menuParentId=1547414817916182529, name=商品分组, level=2, type=1),
 *      MenuBO(id=1547415128978350082, menuParentId=1547414986762084353, name=添加, level=3, type=2),
 *      MenuBO(id=1547415281852342273, menuParentId=1547414986762084353, name=删除, level=3, type=2)
 *      ]
 *
 * 期望类型:
 *      [{
 * 	        "id": 1547414817916182529,
 * 	        "name": "商品管理",
 * 	        "menuVOList": [{
 * 		        "id": 1547414986762084353,
 * 		        "name": "商品列表",
 * 		        "menuVOList": [{
 * 			        "id": 1547415128978350082,
 * 			        "name": "添加",
 * 			        "menuVOList": []
 *              }, {
 * 			        "id": 1547415281852342273,
 * 			        "name": "删除",
 * 			        "menuVOList": []
 *              }]
*           }, {
 * 		        "id": 1547415070325202945,
 * 		        "name": "商品分组",
 * 		        "menuVOList": []
 * 		    }]
 *      }, {
 * 	        "id": 1547414920685019137,
 * 	        "name": "订单管理",
 * 	        "menuVOList": []
 *      }]
 *
 * @author Chaim
 * @date 2022/8/25 23:48
 */
//@formatter:on
public class MenuData {
    public static void main(String[] args) {
        // 模拟数据
        List<MenuBO> data = getData();

        // 转换数据结构
        List<MenuVO> resultList = data.stream()
                .filter(menuBO -> 1 == menuBO.getLevel())
                .map(menuBO ->
                        MenuVO.builder()
                                .id(menuBO.getId())
                                .name(menuBO.getName())
                                .menuVOList(getChildren(menuBO, data))
                                .build())
                .collect(Collectors.toList());
        System.out.println(data.toString());
        System.out.println(resultList.toString());
    }

    public static List<MenuVO> getChildren(MenuBO menuBO, List<MenuBO> menuBOList) {
        return menuBOList.stream()
                .filter(item -> item.getMenuParentId().equals(menuBO.getId()))
                .map((item) ->
                        MenuVO.builder()
                                .id(item.getId())
                                .name(item.getName())
                                .menuVOList(getChildren(item, menuBOList))
                                .build()
                )
                .collect(Collectors.toList());
    }

    /**
     * 生成模拟数据
     *
     * @return
     */
    public static List<MenuBO> getData() {
        List<MenuBO> menuBOList = new ArrayList<>();

        MenuBO menuLevelOne = new MenuBO();
        menuLevelOne.setId(1547414817916182529L);
        menuLevelOne.setMenuParentId(0L);
        menuLevelOne.setName("商品管理");
        menuLevelOne.setLevel(1);
        menuLevelOne.setType(1);
        menuBOList.add(menuLevelOne);

        MenuBO menuLevelOne2 = new MenuBO();
        menuLevelOne2.setId(1547414920685019137L);
        menuLevelOne2.setMenuParentId(0L);
        menuLevelOne2.setName("订单管理");
        menuLevelOne2.setLevel(1);
        menuLevelOne2.setType(1);
        menuBOList.add(menuLevelOne2);

        MenuBO menuLevelTwo = new MenuBO();
        menuLevelTwo.setId(1547414986762084353L);
        menuLevelTwo.setMenuParentId(1547414817916182529L);
        menuLevelTwo.setName("商品列表");
        menuLevelTwo.setLevel(2);
        menuLevelTwo.setType(1);
        menuBOList.add(menuLevelTwo);

        MenuBO menuLevelTwo2 = new MenuBO();
        menuLevelTwo2.setId(1547415070325202945L);
        menuLevelTwo2.setMenuParentId(1547414817916182529L);
        menuLevelTwo2.setName("商品分组");
        menuLevelTwo2.setLevel(2);
        menuLevelTwo2.setType(1);
        menuBOList.add(menuLevelTwo2);

        MenuBO menuLeveThree = new MenuBO();
        menuLeveThree.setId(1547415128978350082L);
        menuLeveThree.setMenuParentId(1547414986762084353L);
        menuLeveThree.setName("添加");
        menuLeveThree.setLevel(3);
        menuLeveThree.setType(2);
        menuBOList.add(menuLeveThree);

        MenuBO menuLeveThree2 = new MenuBO();
        menuLeveThree2.setId(1547415281852342273L);
        menuLeveThree2.setMenuParentId(1547414986762084353L);
        menuLeveThree2.setName("删除");
        menuLeveThree2.setLevel(3);
        menuLeveThree2.setType(2);
        menuBOList.add(menuLeveThree2);

        return menuBOList;
    }
}

MenuBO.java

package com.chaim.special.data.menu;

import lombok.Data;

/**
 * @author Chaim
 * @date 2022/8/25 23:48
 */
@Data
public class MenuBO {

    /**
     * ID
     */
    private Long id;

    /**
     * 父ID
     */
    private Long menuParentId;

    /**
     * 名称
     */
    private String name;

    /**
     * 级别:1-1级,2-2级,3-3级
     */
    private Integer level;

    /**
     * 类型:1-菜单,2-按钮
     */
    private Integer type;
}

MenuVO.java

package com.chaim.special.data.menu;

import lombok.Builder;
import lombok.Data;

import java.util.List;

/**
 * @author Chaim
 * @date 2022/8/25 23:48
 */
@Data
@Builder
public class MenuVO {

    /**
     * ID
     */
    private Long id;

    /**
     * 名称
     */
    private String name;

    /**
     * 子级数据
     */
    private List<MenuVO> menuVOList;

    @Override
    public String toString() {
        return "{" +
                "\"id\":" + id +
                ", \"name\":\"" + name + '\"' +
                ", \"menuVOList\":" + menuVOList +
                '}';
    }
}


版权声明:本文为qq_38637558原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。