java生成部門或選單的分叉樹 for迴圈遞迴 資料量小可以 大的話就是龜速 (第一次分享 望指正!)
阿新 • • 發佈:2018-12-21
最近公司遍歷資料部門 生成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; }
暫時沒有找到可優化的好方案 望各位大佬 提供可行性方案