樹工具類

樹工具類,記錄一下,之後備用。java

1.Tree bean類,保存樹節點信息node

import java.util.ArrayList;
import java.util.List;

/**
 * Created by rico on 2017/1/3.
 * Tree bean
 */
public class TreeNode<T, E> {

    private E nodeId;
    private E parentId;
    private T data;
    private List<TreeNode<T, E>> children = new ArrayList<TreeNode<T, E>>();

    public TreeNode(E nodeId, E parentId, T data) {
        this.nodeId = nodeId;
        this.parentId = parentId;
        this.data = data;
    }

    public E getNodeId() {
        return nodeId;
    }

    public void setNodeId(E nodeId) {
        this.nodeId = nodeId;
    }

    public E getParentId() {
        return parentId;
    }

    public void setParentId(E parentId) {
        this.parentId = parentId;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public List<TreeNode<T, E>> getChildren() {
        return children;
    }

    public void setChildren(List<TreeNode<T, E>> children) {
        this.children = children;
    }

    public void addChild(TreeNode<T, E> node) {
        children.add(node);
    }
    
    public boolean hasChildren() {
        return (children!=null && !children.isEmpty());
    }


}

2.樹構建工具,遞歸遍歷節點,構建樹工具

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by rico on 2017/1/3.
 * 樹構建工具
 */
public class TreeUtil {
    private static final Logger logger = LoggerFactory.getLogger(TreeUtil.class);

    public static <T, E> TreeNode<T, E> buildTree(List<TreeNode<T, E>> nodes, E rootId) {

        if(nodes==null || nodes.size()==0) {
            return null;
        }

        // 查詢根節點
        TreeNode<T, E> rootNode = getRootNode(nodes, rootId);
        if(rootNode == null) {
            logger.warn("未找到根節點rootId = {}", rootId);
            return null;
        }

        // 遍歷節點構造樹
        TreeNode<T, E> treeNode = buildTree(nodes, rootNode);
        return treeNode;
    }

    /**
     * 遍歷節點構造樹
     * @param nodes
     * @param rootNode
     * @param <T>
     * @param <E>
     * @return
     */
    public static <T, E> TreeNode<T, E> buildTree(List<TreeNode<T, E>> nodes, TreeNode rootNode) {

        for(TreeNode node : nodes) {
            if(node.getParentId().equals(rootNode.getNodeId())) {
                // 子節點添加到父節點子集合
                rootNode.addChild(node);

                // 遞歸遍歷子節點
                buildTree(nodes, node);
            }
        }

        return rootNode;
    }


    /**
     * 查詢根節點
     * @param nodes
     * @param rootId
     * @param <T>
     * @param <E>
     * @return
     */
    public static <T, E> TreeNode<T, E> getRootNode(List<TreeNode<T, E>> nodes, E rootId) {

        for(TreeNode node : nodes) {
            //TODO 類型判斷?
            //if((rootId instanceof String) && rootId.equals(node.getRootId())) {
            if(rootId.equals(node.getNodeId())) {
                return node;

            } else if(node.getNodeId() == rootId) {
                return node;
            }
        }

        return null;
    }

    /**
     * 反轉列表順序
     * @param list
     * @param <T>
     * @return
     */
    public static <T> List<T> reverseList(List<T> list) {
        if(list==null || list.isEmpty()) {
            return list;
        }

        List<T> temps = new ArrayList<T>();
        for(int i=list.size()-1; i>=0; i--) {
            temps.add(list.get(i));
        }

        return temps;
    }

    /**
     * 遍歷數節點,轉換爲列表
     * @param datas
     * @param node
     * @param include
     * @param <T>
     * @param <E>
     * @return
     */
    public static <T, E> List<T> toList(List<T> datas, TreeNode<T, E> node, boolean include) {

        // 是否包含該節點
        if(include) {
            datas.add(node.getData());
        }

        if(!node.hasChildren()) {
            return datas;
        }

        for(TreeNode<T, E> subNode : node.getChildren()) {
            toList(datas, subNode, true);
        }

        return datas;
    }
}
相關文章
相關標籤/搜索