樹工具類,記錄一下,之後備用。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; } }