将List数据转成树的两种⽅式(递归、循环)
在做⽤户菜单权限的时候(因为多张表关联外键,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".Level())){
trees.add(menuTree);
for (MenuTree it : menuTrees) {
//出⼀级菜单下⾯的所有⼆级菜单,并加⼊到list中去
if (Id().ParentId())) {
if (Children() == null) {
lua字符串转数组menuTree.setChildren(new ArrayList<MenuTree>());
}
}
}
}
}
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".Level())) {
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) {
Id().ParentId())) {
if (Children() == null) {
menuTree.setChildren(new ArrayList<MenuTree>());
}
}
}
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);
}
仍在不断学习中,如有不妥还望各位⼤神留⾔指教
代码下载地址在下⼀篇根据⽤户查询相关菜单的博客中

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。