TreeUtil(树形结构转换)

博客介绍了Java中树结构相关内容,包含Entity实体类、TreeUtils以及Test,转载自https://www.jianshu.com/p/fabedd4d2884 ,涉及列表、链表等信息技术知识。

TreeUtil(树形结构转换)

1、Entity(实体类)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class RegionTree {

    //id
    private String id;

    //父节点id
    private String parentId;

    //子节点
    private List<RegionTree> children;
}

2、TreeUtils

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TreeUtil {
    /**
     * 创建树结构
     *
     * @param regionTrees 树形结构list
     * @return treeList
     */
    public static List<RegionTree> tree(List<RegionTree> regionTrees) {
        //返回的节点树
        List<RegionTree> rootNodes = new ArrayList<>();
        Iterator<RegionTree> it = regionTrees.iterator();
        while (it.hasNext()) {
            RegionTree next = it.next();
            //parent(上级Id)为0的是根节点
            if (StringUtils.isEmpty(next.getParentId())) {
                rootNodes.add(next);
                it.remove();
            }
        }

        //遍历,找到二级节点
        for (RegionTree regionTree : rootNodes) {
            List<RegionTree> child = getChild(regionTrees, regionTree.getId().toString());
            regionTree.setChildren(child);
        }
        return rootNodes;

    }

    /**
     * 查子节点
     *
     * @param regions  树结构对象
     * @param parentId 父id
     * @return treeList
     */
    private static List<RegionTree> getChild(List<RegionTree> regions, String parentId) {

        //子节点列表
        List<RegionTree> childList = new ArrayList<>();
        Iterator<RegionTree> it = regions.iterator();
        while (it.hasNext()) {
            RegionTree regionTree = it.next();
            if (parentId.equals(regionTree.getParentId())) {
                childList.add(regionTree);
                it.remove();
            }
        }

        //遍历 递归获取子节点的子节点
        for (RegionTree regionTree : childList) {
            List<RegionTree> child = getChild(regions, regionTree.getId().toString());
            regionTree.setChildren(child);
        }

        //递归出口  childList长度为0
        if (childList.size() == 0) {
            return new ArrayList<>();
        }
        return childList;
    }
}

3、Test

public class TestTreeUtils {
    public static void main(String[] args) {
        List<RegionTree> list = new ArrayList<>();

        RegionTree m1 = new RegionTree("1", null, null);
        RegionTree m2 = new RegionTree("2", "1", null);
        RegionTree m3 = new RegionTree("3", "2", null);
        RegionTree m4 = new RegionTree("4", "3", null);
        RegionTree m5 = new RegionTree("5", "3", null);

        list.add(m1);
        list.add(m2);
        list.add(m3);
        list.add(m4);
        list.add(m5);

        RegionTree m11 = new RegionTree("6", null, null);
        RegionTree m12 = new RegionTree("7", "6", null);
        RegionTree m13 = new RegionTree("8", "7", null);
        RegionTree m14 = new RegionTree("9", "8", null);
        RegionTree m15 = new RegionTree("10", "8", null);

        list.add(m15);
        list.add(m11);
        list.add(m12);
        list.add(m13);
        list.add(m14);

        List<RegionTree> regionTreeTree = TreeUtil.tree(list);

        System.out.println(regionTreeTree);
    }
}

转载自:https://www.jianshu.com/p/fabedd4d2884

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值