将List数据转成树的两种方式(递归、循环)

it2022-05-05  109

在做用户菜单权限的时候(因为多张表关联外键,hibernate返回回去会出现无限循环),所以把他转换成和数据库无关的VO类即可

一 、VO类如下

** * * * 封装菜单的树形结构 * @author 六松岛福小林 * **/ public class MenuTree implements java.io.Serializable { /** * 树形节点id */ private String id; /** * 菜单级别 0为第一级菜单,1为第二级菜单…… */ private String level; /** * 父级树形id */ private String parentId; /** * 树形节点名称 */ private String name; /** * 对应的菜单图片路径 */ private String imagePath; /** * 菜单对应的url地址 */ private String url; /** * 子节点list */ private List<MenuTree> children; ……对应的Getter和Setter 这个在此省略…… }

二、封装的树形工具类如下 备注:循环和递归使用任何一种即可

/** * 两层循环实现建树 * @param menuTrees 传入的树节点列表 * @return List<MenuTree> 子节点集合 */ public static List<MenuTree> build(List<MenuTree> menuTrees) { //返回的树形结构数据 List<MenuTree> trees = new ArrayList<>(); //循环菜单树形数据 for (MenuTree menuTree : menuTrees) { //菜单级别为0,则是一级数据,根据实际情况判断可修改相关关联判断 if("0".equals(menuTree.getLevel())){ trees.add(menuTree); for (MenuTree it : menuTrees) { //找出一级菜单下面的所有二级菜单,并加入到list中去 if (menuTree.getId().equals(it.getParentId())) { if (menuTree.getChildren() == null) { menuTree.setChildren(new ArrayList<MenuTree>()); } menuTree.getChildren().add(it); } } } } return trees; } /** * 使用递归方法建树 * @param menuTrees 子节点集合 * @return List<MenuTree> */ public static List<MenuTree> buildByRecursive(List<MenuTree> menuTrees) { List<MenuTree> trees = new ArrayList<>(); for (MenuTree menuTree : menuTrees) { //菜单级别为0,则是一级数据,根据实际情况判断可修改相关关联判断 if ("0".equals(menuTree.getLevel())) { trees.add(findChildren(menuTree,menuTrees)); } } return trees; } /** * 递归查找子节点 * @param menuTree 菜单数对象 * @param menuTrees 子节点 * @return MenuTree */ private static MenuTree findChildren(MenuTree menuTree,List<MenuTree> menuTrees) { for (MenuTree it : menuTrees) { if(menuTree.getId().equals(it.getParentId())) { if (menuTree.getChildren() == null) { menuTree.setChildren(new ArrayList<MenuTree>()); } menuTree.getChildren().add(findChildren(it,menuTrees)); } } return menuTree; }

三、调用

/** *根据用户id返回菜单的树形数据 * @param userId 用户的id * @param systemService 操作数据库的service * @return 封装好的菜单树形数据 */ public static List<MenuTree> getMenuTreeList(String userId, SystemService systemService) throws Exception{ //查询该用户所有的菜单数据 List<Map<String, Object>> menuDataList = getMenuDataList(userId, systemService); //封装成菜单对象list List<MenuTree> menuList = getMenuList(menuDataList); //调用封装树形数据方法 return TreeBuilder.build(menuList); }

仍在不断学习中,如有不妥还望各位大神留言指教

代码下载地址 在下一篇根据用户查询相关菜单的博客中


最新回复(0)