From c09249dfe425db29358451eecbcb0f37c2347f2a Mon Sep 17 00:00:00 2001 From: GPU is all you need <2778335106@qq.com> Date: Thu, 19 May 2022 20:15:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=81=E8=A3=85=E7=9A=84=E6=A0=91=E5=BD=A2?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../award/common/util/treeUtils/TreeNode.java | 34 +++++++++ .../common/util/treeUtils/TreeUtils.java | 70 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeNode.java create mode 100644 awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeUtils.java diff --git a/awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeNode.java b/awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeNode.java new file mode 100644 index 0000000..cba299e --- /dev/null +++ b/awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeNode.java @@ -0,0 +1,34 @@ +package edu.ncst.award.common.util.treeUtils; + + +import java.util.List; + +public class TreeNode { + private Integer id; + private Integer parentId; + private List Children; + + public List getChildren() { + return Children; + } + + public void setChildren(List children) { + Children = children; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getParentId() { + return parentId; + } + + public void setParentId(Integer parentId) { + this.parentId = parentId; + } +} diff --git a/awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeUtils.java b/awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeUtils.java new file mode 100644 index 0000000..7164187 --- /dev/null +++ b/awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeUtils.java @@ -0,0 +1,70 @@ +package edu.ncst.award.common.util.treeUtils; + +import cn.hutool.core.util.ReflectUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 菜单工具类 + * + * @author Gpu is all you need + * @date 2022/05/07 + */ +public class TreeUtils { + + public interface Convert { + void convert(T dataObject, TreeNode treeNode); + } + + + /** + * 构建树结构 + * + * @param parentNodeId 根节点id + * @param treeNodes 所有节点的列表 + * @param convert 转换接口实现 treeNode 转换 目标节点 (把目标节点的属性复制给treeNode) + * @param 目标节点类型 + * @return 树结构 目标节点类型 + */ + static public List + build(Integer parentNodeId, List treeNodes, Class dataObjectClass, Convert convert) { + + // 防止对原始数据做修改 + List result = new ArrayList<>(); + + for (T dataObject : treeNodes) { + E treeNode = ReflectUtil.newInstance(dataObjectClass); + convert.convert(dataObject, treeNode); + result.add(treeNode); + } + + for (E menu : result) { + if (menu.getParentId().equals(parentNodeId)) { + innerBuild(menu, result); + } + } + // 只要树结构,去掉多余的那种散落其他地方但是已经挂在树上的 + return result.stream().filter(treeNode -> treeNode.getParentId().equals(parentNodeId)).collect(Collectors.toList()); + } + + /** + * 递归内部构建 + * + * @param parentTreeNode 初始父节点 / 上一次调用的节点作为父节点 + * @param treeNodes 所有节点的列表 + */ + static private void innerBuild(TreeNode parentTreeNode, List treeNodes) { + for (TreeNode treeNode : treeNodes) { + if (treeNode.getParentId().equals(parentTreeNode.getId())) { + if (parentTreeNode.getChildren() == null) { + parentTreeNode.setChildren(new ArrayList<>()); + } + innerBuild(treeNode, treeNodes); + parentTreeNode.getChildren().add(treeNode); + } + } + } +} +