JAVA-树状结构数据构建

关于树状结构数据构建文章有很多,但是通常网上的都会涉及到数据的大量遍历来完成;

实际上当你构建的树数据量过大时就可能出现超时问题,导致无法正常进行;

正好遇到了这种500多条数据,然后用正常的方法时会导致超时现象,而这个现象通过减少list列表可以去除,于是仔细debug代码

发现问题在于就是数据过多,导致一些重复计算

于是改良一下方法,下面上代码




private void buildTree(List<DayDaoOrgVo> results, List<DayDaoOrgVo> all, Map<String, DayDaoOrgVo> cacheMap) {
        for (DayDaoOrgVo dayDaoOrgVo : results) {
            String orgId = dayDaoOrgVo.getOrgId();
            if (cacheMap.containsKey(orgId)) {
                //从缓存中取出子树
                dayDaoOrgVo.setChildrens(cacheMap.get(orgId).getChildrens());
            } else {
                if (!StringUtil.isEmpty(orgId)) {
                    if (!cacheMap.containsKey(orgId)) {
                        for (DayDaoOrgVo vo : all) {
                            if (!StringUtil.isEmpty(vo.getParentOrgId()) && orgId.equals(vo.getParentOrgId())) {
                                dayDaoOrgVo.getChildrens().add(vo);
                            }
                        }
                        //将已构建的树存入缓存,减少计算
                        cacheMap.put(orgId, dayDaoOrgVo);
                    }
                    //递归子列表
                    if (!CollectionUtils.isEmpty(dayDaoOrgVo.getChildrens())) {
                        buildTree(dayDaoOrgVo.getChildrens(), all, cacheMap);
                    }
                }
            }
        }
    }

稍微解释一下,cacheMap存储的就是id以及对应对象,就是通过判断你的这个缓存中是否存在这个id,如果不存在则是一样构建逻辑,只是会在每次遍历完后添加该条数据到缓存map中,如果存在缓存,则可以直接从缓存取出;

不过这里还是有个小问题,就是你的根必须为第一个遍历的对象,否则可能会存在问题

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值