tupaiopiao 2022-08-15 13:27 采纳率: 80.3%
浏览 49
已结题

Java怎么做树型数据

数据库里面的数据是这样子的

img


想要做成的数据结构是这样子的

img


没有思路

  • 写回答

2条回答 默认 最新

  • Max恒 Java领域新星创作者 2022-08-15 14:26
    关注
    
    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);
        }
    
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月15日
  • 已采纳回答 9月7日
  • 创建了问题 8月15日

悬赏问题

  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了