手写递归算法

递归

需要返回的数据类型

{
    "name":"江西",
    "id":1,
    "children":[
        {
            "name":"南昌",
            "id":1000,
            "children":[
                {
                    "name":"青山湖区",
                    "id":10001
                },
                {
                    "name":"高新区",
                    "id":10002
                }
            ]
        },
        {
            "name":"九江",
            "id":1001
        },
        {
            "name":"赣州",
            "id":1002
        }
    ]
}

能获得的数据类型

| id | name | pid |childrennum|

代码

 @Override
    public  Map<String, Object> selectUnitTree(Map<String, Object> param) throws Exception {

        List<Map<String, Object>> list = this.getDao().queryForList("HJSF_COMMON.selectPT_DM_ZZJG_ZTREE", param);
        if (CollectionUtils.isEmpty(list)) {
            return new HashMap<>();
        }
        //单位上级id为key,value为下级的集合
        Map<String, List<Map>> listToMapBySjzzjgdm = listToMapList(list, "pid");
        //单位id为key,value为单位信息
        Map<String, Map<String, Object>> listToMapByZzjgdm = list.stream().collect(Collectors.toMap(s -> (String) s.get("id"), s -> s));
        //找到跟登录单位一致的那个记录,定为树根
        Map<String, Object> loginZzjgdmMap = listToMapByZzjgdm.get((String) param.get("id"));
        if (MapUtils.isEmpty(loginZzjgdmMap)) {
            return new HashMap<>();
        }
       Map<String, Object> resultMap = getResultMap((String) param.get("id"), listToMapBySjzzjgdm, listToMapByZzjgdm);
        return resultMap;
    }


    private Map<String, Object> getResultMap(String id, Map<String, List<Map>> listToMapBySjzzjgdm, Map<String, Map<String, Object>> listToMapByZzjgdm) {
        Map<String, Object>  resultMap = new HashMap<>();
        //拿出需要操作的根节点
        Map<String, Object> map = listToMapByZzjgdm.get(id);
        //此节点是否存在
        if (MapUtils.isEmpty(map)) {
            return resultMap;
        }
        resultMap.put("name", (String) map.get("name"));
        resultMap.put("id", (String) map.get("id"));
        //此节点不是叶子节点,则增加一个children列表
        List<Map> childernMapList = new ArrayList<Map>();
        if (!"0".equals(((BigDecimal)map.get("childrennum")).toString())) {
            List<Map> list = listToMapBySjzzjgdm.get((String) map.get("id"));
            if(CollectionUtils.isEmpty(list)){
                return resultMap;
            }
            for (Map map1:list) {
                //是否有children
                if (resultMap.containsKey("children")) {
                    childernMapList = (List<Map>) resultMap.get("children");
                }
                childernMapList.add(getResultMap((String) map1.get("id"), listToMapBySjzzjgdm, listToMapByZzjgdm));
            }
            resultMap.put("children", childernMapList);
        }
        return resultMap;
    }



    private Map<String, List<Map>> listToMapList(List<Map<String, Object>> list, String key) {
        //按模板类型项目Map
        Map<String, List<Map>> itemMap = new HashMap<String, List<Map>>();
        if (CollectionUtils.isNotEmpty(list)) {
            for (Map item : list) {
                // map中存在该key
                if (itemMap.containsKey(item.get(key))) {
                    // 根据key取出list
                    List<Map> tempList = itemMap.get(item.get(key));
                    // 添加元素
                    tempList.add(item);
                    // 将集合put回map中 此步骤也可以不写
                    itemMap.put((String) item.get(key), tempList);
                } else {
                    // map中不存在该key  直接newList
                    List<Map> tempList = new ArrayList<Map>();
                    // 添加元素
                    tempList.add(item);
                    // 将集合put到map中
                    itemMap.put((String) item.get(key), tempList);
                }
            }
        }
        return itemMap;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值