List生成树状结构 && 广度优先遍历树节点
Posted Java与大数据学习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了List生成树状结构 && 广度优先遍历树节点相关的知识,希望对你有一定的参考价值。
实体类
@Data
public class AreaclTreeVO implements Serializable {
/**
* 地区编码
*/
private String code;
/**
* 地区名称
*/
private String name;
/**
* 地区类型
*/
private Integer type;
/**
* 子节点
*/
private List<AreaclTreeVO> children;
/**
* 地区主键
*/
private String pkAreacl;
/**
* 父节点主键
*/
private String pkFatherarea;
}
List生成树结构
private List<AreaclTreeVO> createAreaTree(){
Map<String, AreaclTreeVO> map = new HashMap<>();
// 查询出所有销售地区
List<AreaclTreeVO> areaclVOList = areaclMapper.selectAreaTree();
if(CollectionUtils.isEmpty(areaclVOList)){
return map;
}
// 将所有节点存入到map集合
//将所有主键做为key,AreaclTreeVO对象做值,存入到map集合
map = areaclVOList.stream()
.collect(Collectors.toMap(AreaclTreeVO::getPkAreacl, areaclTreeVO -> areaclTreeVO));
for (AreaclTreeVO areaclTreeVO : areaclVOList) {
//通过子节点的父节点ID获取父节点
AreaclTreeVO parent = map.get(areaclTreeVO.getPkFatherarea());
if(!Objects.isNull(parent)){
if(Objects.isNull(parent.getChildren())){
parent.setChildren(new ArrayList<>());
}
//将子节点放入父节点中
parent.getChildren().add(areaclTreeVO);
}
}
// 查询出第一级销售区域
List<AreaclTreeVO> result = map.values().stream()
.filter(areaclTreeVO -> AreaclTypeEnum.REGION.getCode().equals(areaclTreeVO.getType()))
.collect(Collectors.toList());
return result;
}
广度优先遍历树结构
private List<AreaclTreeVO> breadthFirst(AreaclTreeVO areaclTreeVO) {
List<AreaclTreeVO> resultList = new ArrayList<>();
if(Objects.isNull(areaclTreeVO)){
return resultList;
}
Queue<AreaclTreeVO> queue = new LinkedList<>();
queue.offer(areaclTreeVO);
while (!queue.isEmpty()) {
areaclTreeVO = queue.poll();
//获得节点的子节点
List<AreaclTreeVO> children = new ArrayList<>();
if(!Objects.isNull(areaclTreeVO)){
children = areaclTreeVO.getChildren();
}
if (!CollectionUtils.isEmpty(children)) {
for (AreaclTreeVO child : children) {
queue.offer(child);
}
}
resultList.add(areaclTreeVO);
}
return resultList;
}
以上是关于List生成树状结构 && 广度优先遍历树节点的主要内容,如果未能解决你的问题,请参考以下文章