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 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启