diff --git a/spring-boot-demo-util/src/main/java/com/xkcoding/util/TreeUtil.java b/spring-boot-demo-util/src/main/java/com/xkcoding/util/TreeUtil.java new file mode 100644 index 000000000..ea428f658 --- /dev/null +++ b/spring-boot-demo-util/src/main/java/com/xkcoding/util/TreeUtil.java @@ -0,0 +1,129 @@ +package com.xkcoding.util; + +import com.google.common.collect.Lists; +import com.xiaoleilu.hutool.json.JSONUtil; +import com.xkcoding.util.domain.TreeNode; + +import java.util.Iterator; +import java.util.List; + +/** + *

+ * 把一个list集合,里面的bean含有 parentId 转为树形式 + *

+ * + * @package: com.xkcoding.util + * @description: 把一个list集合, 里面的bean含有 parentId 转为树形式 + * @author: yangkai.shen + * @date: Created in 2017/12/7 上午10:26 + * @copyright: Copyright (c) 2017 + * @version: 0.0.1 + * @modified: yangkai.shen + */ +public class TreeUtil { + + /** + * 测试层级 + * + * @param args + */ + public static void main(String[] args) { + long start = System.currentTimeMillis(); + + List treeObjectList = Lists.newArrayList(); + + treeObjectList.add(new TreeNode(1, "总部", 0, "0", 1, "总部", Lists.newArrayList())); + treeObjectList.add(new TreeNode(2, "技术部", 1, "0,1", 1, "技术部", Lists.newArrayList())); + treeObjectList.add(new TreeNode(3, "软件部", 2, "0,1,2", 1, "软件部", Lists.newArrayList())); + treeObjectList.add(new TreeNode(4, "硬件部", 2, "0,1,2", 2, "硬件部", Lists.newArrayList())); + treeObjectList.add(new TreeNode(5, "维修部", 4, "0,1,2,4", 1, "维修部", Lists.newArrayList())); + treeObjectList.add(new TreeNode(6, "采购部", 4, "0,1,2,4", 2, "采购部", Lists.newArrayList())); + + TreeUtil mt = new TreeUtil(); + + List ns = mt.getChildTreeNodes(treeObjectList, 0); + + for (TreeNode m : ns) { + System.out.println(m); + System.out.println(JSONUtil.parseObj(m, false).toStringPretty()); + } + + long end = System.currentTimeMillis(); + + System.out.println("用时:" + (end - start) + "ms"); + } + + /** + * 根据父节点 id 获取所有子节点 + * + * @param list 列表 + * @param parentId 父节点 id + * @return 所有子节点 + */ + public List getChildTreeNodes(List list, Integer parentId) { + List returnList = Lists.newArrayList(); + for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { + TreeNode t = iterator.next(); + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId().equals(parentId)) { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + * + * @param list 列表 + * @param t 树节点 + */ + private void recursionFn(List list, TreeNode t) { + // 得到子节点列表 + List childList = getChildList(list, t); + + t.setChildren(childList); + for (TreeNode tChild : childList) { + // 判断是否有子节点 + if (hasChild(list, tChild)) { + Iterator it = childList.iterator(); + while (it.hasNext()) { + TreeNode n = it.next(); + recursionFn(list, n); + } + } + } + } + + /** + * 判断是否存在子节点 + * + * @param list + * @param tChild + * @return + */ + private boolean hasChild(List list, TreeNode tChild) { + return getChildList(list, tChild).size() > 0; + } + + /** + * 获得子节点列表 + * + * @param list + * @param t + * @return + */ + private List getChildList(List list, TreeNode t) { + List tlist = Lists.newArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) { + TreeNode n = it.next(); + if (n.getParentId().equals(t.getId())) { + tlist.add(n); + } + } + return tlist; + } + +} diff --git a/spring-boot-demo-util/src/main/java/com/xkcoding/util/domain/TreeNode.java b/spring-boot-demo-util/src/main/java/com/xkcoding/util/domain/TreeNode.java new file mode 100644 index 000000000..7d6c969b1 --- /dev/null +++ b/spring-boot-demo-util/src/main/java/com/xkcoding/util/domain/TreeNode.java @@ -0,0 +1,55 @@ +package com.xkcoding.util.domain; + +import com.google.common.collect.Lists; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + *

+ * 树节点 + *

+ * + * @package: com.xkcoding.util.domain + * @description: 树节点 + * @author: yangkai.shen + * @date: Created in 2017/12/7 上午10:27 + * @copyright: Copyright (c) 2017 + * @version: 0.0.1 + * @modified: yangkai.shen + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TreeNode { + /** + * id 编号 + */ + private Integer id; + /** + * 节点名称 + */ + private String name; + /** + * 父节点 id + */ + private Integer parentId; + /** + * 层级 + */ + private String level; + /** + * 当前层级顺序 + */ + private Integer seq; + /** + * 备注 + */ + private String remark; + /** + * 子节点列表 + */ + private List children = Lists.newArrayList(); +}