递归

来源:互联网 发布:php个人博客网站模板 编辑:程序博客网 时间:2024/06/05 00:44

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, "获取分类树失败");        }    }
原创粉丝点击