使用线程的列表构建树结构
areaCode为要构建树的根结点
分4步走:
第一步:查询根相关的数据,一般使用 like 查询关联结点 (准备数据)
第二步:转成有child 属性的结构 (输入数据)
第三步:根据父结点分组,遍历列表,依次将分组好的子列表放在对应的父结点下面。(处理数据)
第四步: 返回根结点。(返回数据)
List<SysAreaInfo> sysAreaInfos = sysAreaInfoMapper.getCurrentTree(areaCode);
List<SysAreaInfoVo> sysAreaInfoQueryVos = SysAreaInfoAdapter.adaptSysAreaInfoVos(sysAreaInfos);
HashMap<Long,SysAreaInfoVo> map=new HashMap<>();
sysAreaInfoQueryVos.stream().forEach(temp->{
map.put(temp.getAreaCode(),temp);
});
SysAreaInfoVo root=map.get(areaCode);
Map<Long, List<SysAreaInfoVo>> allMap = sysAreaInfoQueryVos.stream().collect(Collectors.groupingBy(SysAreaInfoVo::getParentCode));
sysAreaInfoQueryVos.forEach(temp->{
List<SysAreaInfoVo> sysAreaInfoVos = allMap.get(temp.getAreaCode());
if(sysAreaInfoVos!=null&&sysAreaInfoVos.size()>0){
temp.setChildren(sysAreaInfoVos);
}
});
return root;
最近工作中遇到问题,java的一个树结构,需要通过关键词搜索,返回前端树形结构。
觉着比较麻烦,就拒绝做。 结果是直属领导,用中午休息时间就把这个做出来了。汗颜!
private List<? extends HuaPingBaseEntity> doSearchVideo(List<? extends HuaPingBaseEntity> searchList, String keyWord) {
List<HuaPingBaseEntity> resultList = new ArrayList<>();
for (HuaPingBaseEntity entity : searchList) {
// 判断是否包括keyWord
String devName = ((Dev) entity).getDevName();
if (devName.contains(keyWord)) {
resultList.add(entity);
}
else {
// 继续递归
List<? extends HuaPingBaseEntity> subList = doSearchVideo(entity.getSubList(), keyWord);
if (!CollectionUtils.isEmpty(subList)) {
// 把子节点列表加到节点上
entity.setSubList(subList);
resultList.add(entity);
}
}
}
return resultList;
}
思路是,查询本结点的名称,是都包含关键词,
有,就返回到上一个目录。
没有,继续遍历子目录。