All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.acyou.leo.framework.util.TreeUtil Maven / Gradle / Ivy

package cn.acyou.leo.framework.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import cn.acyou.leo.framework.model.TreeNode;

/**
 * 构建树形结构工具
 * 配合{@link TreeNode}使用
 * @author youfang
 * @version [1.0.0, 2020/7/8]
 **/
public class TreeUtil {

    /**
     * 根据所有树节点列表,生成含有所有树形结构的列表
     *
     * @param nodes 树形节点列表
     * @param    节点类型
     * @return 树形结构列表
     */
    public static > List buildTrees(List nodes) {
        List rootNodes = new ArrayList<>();
        for (Iterator ite = nodes.iterator(); ite.hasNext(); ) {
            E node = ite.next();
            if (node.root()) {
                rootNodes.add(node);
                //从所有节点列表中删除该节点,以免后续重复遍历该节点
                ite.remove();
            }
        }
        rootNodes.forEach(r -> setChildren(r, nodes));
        return rootNodes;
    }

    /**
     * 从所有节点列表中查找并设置parent的所有子节点
     *
     * @param parent 父节点
     * @param nodes  所有树节点列表
     */
    private static > void setChildren(E parent, List nodes) {
        List children = new ArrayList<>();
        Object parentId = parent.id();
        for (Iterator ite = nodes.iterator(); ite.hasNext(); ) {
            E node = ite.next();
            if (Objects.equals(node.parentId(), parentId)) {
                children.add(node);
                //从所有节点列表中删除该节点,以免后续重复遍历该节点
                ite.remove();
            }
        }
        // 如果子节点不为空,则继续递归设置孩子的孩子
        if (CollectionUtils.isNotEmpty(children)){
            parent.children(children);
            children.forEach(m -> setChildren(m, nodes));
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy