最近公司遍历数据部门 生成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; }
暂时没有找到可优化的好方案 望各位大佬 提供可行性方案