1. 程式人生 > >java生成部門或選單的分叉樹 for迴圈遞迴 資料量小可以 大的話就是龜速 (第一次分享 望指正!)

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;
}

暫時沒有找到可優化的好方案  望各位大佬 提供可行性方案