| package com.mzl.flower.utils; | 
|   | 
| import com.mzl.flower.base.Node; | 
| import lombok.experimental.UtilityClass; | 
| import org.apache.commons.collections4.CollectionUtils; | 
| import org.apache.commons.lang3.StringUtils; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.List; | 
|   | 
| @UtilityClass | 
| public class TreeBuilderUtil { | 
|   | 
|     /** | 
|      * list to tree | 
|      * 默认以parentId 为空的为根节点 | 
|      * | 
|      * @param dirs | 
|      * @return | 
|      */ | 
|     public List<? extends Node> buildListToTree(List<? extends Node> dirs) { | 
|         List<Node> roots = findRoots(dirs, null); | 
|         List<Node> notRoots = (List<Node>) CollectionUtils.subtract(dirs, roots); | 
|         for (Node root : roots) { | 
|             root.setChildren(findChildren(root, notRoots)); | 
|         } | 
|         return roots; | 
|     } | 
|   | 
|     /** | 
|      * list to tree | 
|      * 以parentId 为 rootParentIdValue值 的为根节点 | 
|      * | 
|      * @param dirs | 
|      * @param rootParentIdValue | 
|      * @return | 
|      */ | 
|     public List<? extends Node> buildListToTree(List<? extends Node> dirs, Object rootParentIdValue) { | 
|         List<Node> roots = findRoots(dirs, rootParentIdValue); | 
|         List<Node> notRoots = (List<Node>) CollectionUtils.subtract(dirs, roots); | 
|         for (Node root : roots) { | 
|             root.setChildren(findChildren(root, notRoots)); | 
|         } | 
|         return roots; | 
|     } | 
|   | 
|     /** | 
|      * list to tree | 
|      * 以没有父节点的节点作为根节点 | 
|      * | 
|      * @param dirs | 
|      * @return | 
|      */ | 
|     public List<? extends Node> buildCommonListToTree(List<? extends Node> dirs) { | 
|         List<Node> roots = findRoots(dirs, null); | 
|         List<Node> notRoots = (List<Node>) CollectionUtils.subtract(dirs, roots); | 
|         for (Node root : roots) { | 
|             root.setChildren(findChildren(root, notRoots)); | 
|         } | 
|         return roots; | 
|     } | 
|   | 
|     private List<Node> findRoots(List<? extends Node> allNodes, Object rootParentIdValue) { | 
|         List<Node> results = new ArrayList<Node>(); | 
|         for (Node node : allNodes) { | 
|             if ((isBlank(rootParentIdValue) && (isBlank(node.getParentId()) || "-1".equals(node.getParentId()))) | 
|                     || (isNotBlank(rootParentIdValue) && "-1".equals(node.getParentId()) && rootParentIdValue.equals(node.getParentId()))) { | 
|                 results.add(node); | 
|             } | 
|         } | 
|         return results; | 
|     } | 
|   | 
|     private List<Node> findRoots(List<? extends Node> allNodes) { | 
|         List<Node> results = new ArrayList<Node>(); | 
|         for (Node node : allNodes) { | 
|             boolean isRoot = true; | 
|             for (Node comparedOne : allNodes) { | 
|                 if (isNotBlank(node.getParentId()) && node.getParentId().equals(comparedOne.getId())) { | 
|                     isRoot = false; | 
|                     break; | 
|                 } | 
|             } | 
|             if (isRoot) { | 
|                 results.add(node); | 
|             } | 
|         } | 
|         return results; | 
|     } | 
|   | 
|     private List<Node> findChildren(Node root, List<Node> allNodes) { | 
|         List<Node> children = new ArrayList<Node>(); | 
|   | 
|         for (Node comparedOne : allNodes) { | 
|             if (isNotBlank(comparedOne.getParentId()) && comparedOne.getParentId().equals(root.getId())) { | 
|                 children.add(comparedOne); | 
|             } | 
|         } | 
|         List<Node> notChildren = (List<Node>) CollectionUtils.subtract(allNodes, children); | 
|         for (Node child : children) { | 
|             List<Node> tmpChildren = findChildren(child, notChildren); | 
|             child.setChildren(tmpChildren); | 
|         } | 
|         return children; | 
|     } | 
|   | 
|     private boolean isBlank(Object o) { | 
|         return o == null || StringUtils.isBlank(o.toString()); | 
|     } | 
|   | 
|     private boolean isNotBlank(Object o) { | 
|         return !isBlank(o); | 
|     } | 
| } |