java 递归在部门树结构实际使用
在后台管理的时候会遇到要使用部门树结构 所以一般都是使用递归来完成
首要条件部门表的设计基于parentId来确定部门和部门之间的从属关系
orgId | parentId |
---|---|
1504084286838 | |
1504160376031 | 1504084286838 |
1504160386037 | 1504160376031 |
1509083214761 | 1504084286838 |
orgId为 1504084286838 的parentId为空表示根节点
如果我们查询的是1504084286838的所有节点那么结构如下
|–1504084286838
|--1504160376031
|--1504160386037
|--1509083214761
都是其子节点,其中1504160376031和1509083214761是其直属子节点
一、递归部门以及所有子部门的部门id
/**
*递归所有子部门id
*/
public List<String> getOrgs(String orgId){
List<Org> orgs= orgDao.findAll();//获取所有部门
List<String> children= new ArrayList<>();
List<String> listIds = recurOrgIds(orgId,orgs,children);
listIds.add(orgId );
return listIds
}
public List<String> recurOrgIds(String orgId,List<Org> orgs,List<String> children){
for (Org org : orgs){
if (orgId.equals(org.getParentId())){
children= recurOrgIds(org.orgId(),orgs,children);
children.add(org.getCategoryId());
}
}
return children;
}
二、下面将递归部门以及所有下级部门的部门信息(以json格式返回数据)
public String getOrgTree(){
List<Org> orgs= orgDao.findAll(); //获取所有部门
Org rootOrg = orgDao.getRootOrg();//获取根部门
String rootId = rootOrg.getId();//获取根部门id
//将根节点转换为json字符串
JSONObject jsonObject = JSONObject.fromObject(category);
//递归获子节点
String children = getChildren(list, category.getCategoryId());
jsonObject.put("children", children);
JSONArray jsonArray = JSONArray.fromObject(obj);
return jsonArray.toString();
}
public String getChildren(List<Org> list, String rootId) throws Exception {
List<Object> result = new ArrayList<>();
for (rgOrg org: list) {
JSONObject jsonObject = JSONObject.fromObject(orgorg); //将子节点信息转换为json格式的字符串
if (org.getParentId().equals(rootId)) {
String children = getChildren(list, org.getOrgId());//递归
jsonObject.put("children", children);
result.add(jsonObject);
}
}
JSONArray jsonArray = JSONArray.fromObject(result);
return jsonArray.toString();
}
三、如果部门不是一棵树的形而是多棵树的形式
/**
*其实就是第二部的单棵树做了一个for循环String children = getChildren(list, org.getOrgId());//递归
*/
public String getTrees() {
try {
List<Org> orgs= orgDao.findAll(); //获取所有部门
List<Org> roots = new ArrayList<>(); //找到所有根节点(parentId为空的分类)
List<Org> list = new ArrayList<>();//除了根节点的所有节点
List<Object> trees = new ArrayList<>();
for (Org org : orgs) {
if ("".equals(org.getParentId()) || null == org.getParentId()) {
roots.add(org);
} else {
list.add(org);
}
}
for (Org org : roots) {
JSONObject jsonObject = JSONObject.fromObject(org);//将根节点转换为json字符串
String children = getChildren(list, org.getCategoryId()); //递归获子节点
jsonObject.put("children", children);
trees.add(jsonObject);
}
JSONArray jsonArray = JSONArray.fromObject(trees);
return jsonArray.toString();
} catch (Exception e) {
e.printStackTrace();
return JsonUtil.returnStr(JsonUtil.FAIL, "获取分类树失败");
}
}