以前上学的时候学递归的时候总是会很糊涂,不知道在哪个点重新进入递归循环……但是看别人的代码又会觉得很好并且意犹未尽,借鉴学习吧……
public JSONArray initGrid(Grids parent,User user){
List<Grids> parents=new ArrayList<>();
JSONArray result = new JSONArray();
if (RoleUtil.hasRole(user, "ROLE_SYSTEM") || RoleUtil.hasRole(user, "ROLE_ZX")
|| RoleUtil.hasRole(user, "ROLE_ZG")) {
// ROLE_SYSTEM:超级管理员 ROLE_ZX:省中心管理员 ROLE_ZG:省主管
if (parent == null) {
parents = gridsRepository.findByParentIsNullOrderByCreateDateAsc();
} else {
parents = gridsRepository.findByParentOrderByCreateDateAsc(parent);
}
} else if (RoleUtil.hasRole(user, "ROLE_SZX") || RoleUtil.hasRole(user, "ROLE_SZG")){
// 市中心管理员
if (parent == null) {
parents = gridsRepository.findByGridManagerIDAndGridTypeIsOrderByCreateDateAsc(user.getId(),"nav");
removeItem(parents);
} else {
parents = gridsRepository.findByParentOrderByCreateDateAsc(parent);
}
}
for (Grids grid : parents) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", grid.getId());
map.put("text", grid.getGridName());
map.put("type", grid.getGridType());
map.put("gridManager", grid.getGridManager());
JSONArray children = initGrid(grid,user);
map.put("children", children);
result.add(map);
}
return result;
} List<Grids> parents=new ArrayList<>();
JSONArray result = new JSONArray();
if (RoleUtil.hasRole(user, "ROLE_SYSTEM") || RoleUtil.hasRole(user, "ROLE_ZX")
|| RoleUtil.hasRole(user, "ROLE_ZG")) {
// ROLE_SYSTEM:超级管理员 ROLE_ZX:省中心管理员 ROLE_ZG:省主管
if (parent == null) {
parents = gridsRepository.findByParentIsNullOrderByCreateDateAsc();
} else {
parents = gridsRepository.findByParentOrderByCreateDateAsc(parent);
}
} else if (RoleUtil.hasRole(user, "ROLE_SZX") || RoleUtil.hasRole(user, "ROLE_SZG")){
// 市中心管理员
if (parent == null) {
parents = gridsRepository.findByGridManagerIDAndGridTypeIsOrderByCreateDateAsc(user.getId(),"nav");
removeItem(parents);
} else {
parents = gridsRepository.findByParentOrderByCreateDateAsc(parent);
}
}
for (Grids grid : parents) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", grid.getId());
map.put("text", grid.getGridName());
map.put("type", grid.getGridType());
map.put("gridManager", grid.getGridManager());
JSONArray children = initGrid(grid,user);
map.put("children", children);
result.add(map);
}
return result;
}
再来个进阶版的父子级递归吧,也是在项目中需要进行菜单树父子级结构的遍历,进阶的一点在于,找到了之后把原来的list移除,这样就避免多次遍历已经找到的数据
public JSONArray menuTraversal(Menu parent,List<Menu> list){
List<Menu> parents = new ArrayList<Menu>();
JSONArray result = new JSONArray();
String parentId = parent == null?"0":parent.getId();
Iterator<Menu> iterator = list.iterator();
while (iterator.hasNext()) {
Menu menu = iterator.next();
if(parentId.equals(menu.getParentId())){
parents.add(menu);
iterator.remove();
}
}
if(parents.isEmpty()){
parents.addAll(list);
list.clear();
}
for (Menu menu : parents) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", menu.getId());
map.put("label", menu.getMenuName());
if (list.size()>0) {
JSONArray children = menuTraversal(menu,list);
if (children.size()>0) {
map.put("children", children);
}
}
result.add(map);
}
return result;
}
后记:
每次关于递归的东西就觉得很绕,昨天因为这个问题扭了我大晌的时间最后越来越乱,但是今天早上来了之后思路清晰了很多,顿悟之后一下就可以了,有时候写代码没有头绪的时候,真的需要让自己转移一下

本文通过两个实际案例介绍了递归在构建树形结构中的应用。首先展示了如何使用递归生成网格层级结构,接着深入探讨了一个进阶版的菜单树遍历算法,该算法能够在遍历时移除已处理的数据以提高效率。
532

被折叠的 条评论
为什么被折叠?



