java生成部门或菜单的分叉树 for循环递归 数据量小可以 大的话就是龟速 (第一次分享 望指正!)

最近公司遍历数据部门  生成tree结构的数据    苦恼的头大,搜索多篇 找到一个  暂时解决了数据量小的菜单小问题  如图

/**
 * 递归查找子菜单
 *
 * @param id
 *            当前菜单id
 * @param rootMenu
 *            要查找的列表
 * @return
 */
private List<SysMenuVo> getChild(String id, List<SysMenuVo> rootMenu) {
    // 子菜单
    List<SysMenuVo> childList = new ArrayList<>();
    for (SysMenuVo menu : rootMenu) {
        // 遍历所有节点,将父菜单id与传过来的id比较
        if (menu.getMenuPno().equals(id)) {
            childList.add(menu);
        }
    }
    // 把子菜单的子菜单再循环一遍
    for (SysMenuVo menu : childList) {// 没有url子菜单还有子菜单
        // 递归
        menu.setChildMenus(getChild(menu.getMenuNo(), rootMenu));

    } // 递归退出条件
    if (childList.size() == 0) {
        return null;
    }
    return childList;
}

但是 当数据量达到几千条的部门循环时候 近一分钟  最后改进为map  直接代码:

其中List<SysMenu> SysMenus 为源数据的集合  map为父菜单编号的key  value是SysMenu实体

 

private static List<SysMenu> getChilda(List<SysMenu> SysMenus, Map<String, SysMenu> map){
    List<SysMenuVo> list = new ArrayList<>();
    for (SysMenu sysMenu : SysMenus) {
        if (map.containsKey(sysMenu .getmenupno())) {
            SysMenu sysMenuVoN = map.get(sysMenu.getMenuPno());
            if (null == sysMenuVoN.getChildMenus()){
                List<SysMenuVo> listN = new ArrayList<>();
                listN.add(sysMenuVo);
                sysMenuVoN.setChildMenus(listN);
            }else {
                sysMenuVoN.getChildMenus().add(sysMenu);
            }

        } else {
            list.add(sysMenu);
        }
    }
    return list;
}

暂时没有找到可优化的好方案  望各位大佬 提供可行性方案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

提升自己的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值