使用递归将list转换成tree

发布时间:2024年01月11日

在产品研发时遇到这样一个问题,对于省市区县这类三级联动的数据,前端插件需要一次把数据全部返回,单纯的使用接口查询字节的没办法满足要求。

如果一次把数据全部返回,前端使用起来很麻烦需要一条一条的进行查找。

常规的使用方法是把集合转换成一个有结构的树形结构。

树形结构是一种非线性的数据结构,它由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);
        }
    }

}

转换输出结果

文章来源:https://blog.csdn.net/qq_36154832/article/details/135528354
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。