关于树状结构数据构建文章有很多,但是通常网上的都会涉及到数据的大量遍历来完成;
实际上当你构建的树数据量过大时就可能出现超时问题,导致无法正常进行;
正好遇到了这种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中,如果存在缓存,则可以直接从缓存取出;
不过这里还是有个小问题,就是你的根必须为第一个遍历的对象,否则可能会存在问题