递归

java 递归在部门树结构实际使用

在后台管理的时候会遇到要使用部门树结构 所以一般都是使用递归来完成

首要条件部门表的设计基于parentId来确定部门和部门之间的从属关系

orgIdparentId
1504084286838
15041603760311504084286838
15041603860371504160376031
15090832147611504084286838

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, "获取分类树失败");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值