数据库里面的数据是这样子的
想要做成的数据结构是这样子的
没有思路
package com.learning.tool.递归;
import cn.hutool.json.JSONUtil;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SysMenuList {
public List<SysMenu> getCurrentUserNav(List<SysMenu> menus) {
//转树状结构
List<SysMenu> menuTree = buildThreeMenu(menus);
System.out.println("JSONUtil.toJsonStr(menuTree) = " + JSONUtil.toJsonStr(menuTree));
//递归
System.out.println("JSONUtil.toJsonStr(recursive(menuTree)) = " + JSONUtil.toJsonStr(recursive(menuTree)));
return recursive(menuTree);
}
List<SysMenu> recursive(List<SysMenu> menuTree) {
menuTree.forEach(menu -> {
//判断是否含有子集
if (menu.getChildren() != null && menu.getChildren().size() > 0) {
menu.setChildren(recursive(menu.getChildren()));
}
});
return menuTree;
}
private List<SysMenu> buildThreeMenu(List<SysMenu> menus) {
List<SysMenu> finalMenus = new ArrayList<>();
//各自寻找到各自的孩子
for (SysMenu menu : menus) {
for (SysMenu e : menus) {
//判断当前菜单的id是否是父级id
if (menu.getId().equals(e.getParentId())) {
finalMenus.add(e);
menu.setChildren(finalMenus);
}
}
//提取父节点 当中上方for循环中add进去的子节点的数据
if (menu.getParentId() == 0L) {
finalMenus.add(menu);
}
}
return finalMenus;
}
@Test
public void a() {
List<SysMenu> list = new ArrayList<>();
list.add(SysMenu.builder().id(1L).parentId(0L).name("系统管理").build());
list.add(SysMenu.builder().id(2L).parentId(1L).name("用户管理").build());
list.add(SysMenu.builder().id(3L).parentId(1L).name("角色管理").build());
getCurrentUserNav(list);
}
}