在产品研发时遇到这样一个问题,对于省市区县这类三级联动的数据,前端插件需要一次把数据全部返回,单纯的使用接口查询字节的没办法满足要求。
如果一次把数据全部返回,前端使用起来很麻烦需要一条一条的进行查找。
常规的使用方法是把集合转换成一个有结构的树形结构。
树形结构是一种非线性的数据结构,它由n(n>=0)个有限结点组成,这些结点之间具有层次关系。每个结点可以有零个或多个子结点,其中根结点是层次最高的结点,没有父结点,其他结点有且仅有一个父结点。在树形结构中,子结点的数量被称为该节点的度,树的度是树中最大的度数。树的深度或高度是指树中结点的最大层次数。
实体类
@Data
public class AreaVO implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer pid;
private String areaCode;
private String areaName;
private Integer level;
private List<AreaVO> childList;
}
TreeUtil
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author zhizhao
* @description
* @create 2018-11-14 9:07
*/
public class TreeUtil {
public static List<AreaVO> toTree(List<AreaVO> treeNodeList) {
//数据按照pid分组
Map<Integer, List<AreaVO>> map = treeNodeList.stream().collect(Collectors.groupingBy(AreaVO::getPid));
//找出所有的根节点,pid=0的为根节点
List<AreaVO> areaList = map.get(0);
for (AreaVO areaVO : areaList) {
forEach(map, areaVO);
}
return areaList;
}
private static void forEach(Map<Integer, List<AreaVO>> collect, AreaVO areaVO) {
List<AreaVO> nodeList = collect.get(areaVO.getId());
if (collect.get(areaVO.getId()) == null) {
return;
}
areaVO.setChildList(nodeList);
for (AreaVO node : nodeList) {
forEach(collect, node);
}
}
}
转换输出结果