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

top.zeimao77.product.tree.TreeUtil Maven / Gradle / Ivy

package top.zeimao77.product.tree;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

public class TreeUtil {

    /**
     * 列表转森林数据结构
     * @param lines 节点列表
     * @param fun 将一个行节点为转为树节点的方法
     * @return
     */
    public static  List createTree(List lines, Function fun) {
        List tree = new ArrayList<>();
        for (Iterator iterator = lines.iterator(); iterator.hasNext();) {
            T line = iterator.next();
            if("0".equals(line.__getParentId())) {
                W treeNode = fun.apply(line);
                tree.add(treeNode);
                iterator.remove();
            }
        }
        for (TreeNode treeNode : tree) {
            createChild(treeNode,lines,fun);
        }
        return tree;
    }

    private static  void createChild(TreeNode treeNode, List lines, Function fun){
        for (Iterator iterator = lines.iterator(); iterator.hasNext();) {
            T line = iterator.next();
            if(treeNode.__getNodeId().equals(line.__getParentId())) {
                W tnode = fun.apply(line);
                treeNode.addChild(tnode);
                iterator.remove();
            }
        }
        List childs = treeNode.childs();
        if(childs != null && !childs.isEmpty()) {
            for (TreeNode child : childs) {
                createChild(child,lines,fun);
            }
        }
    }

    /**
     * 遍历一个树
     * @param node 树顶级节点
     * @param con 树的消费者
     * @param  节点
     */
    public static  void forTree(T node, Consumer con) {
        List childs = node.childs();
        if(childs != null && !childs.isEmpty()) {
            for (T child : childs) {
                forTree(child,con);
            }
        }
        con.accept(node);
    }

    /**
     * 对单树进行修剪,从叶子开始
     * @param node 树节点
     * @param pred 如果返回true节点将会被移除
     */
    public static  boolean trimTree(T node, Predicate pred) {
        List childs = node.childs();
        if(childs != null && !childs.isEmpty()) {
            for(Iterator iterator = childs.iterator(); iterator.hasNext();) {
                T next = iterator.next();
                if(trimTree(next, pred)) {
                    iterator.remove();
                }
            }
        }
        return pred.test(node);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy