diff --git a/muyun-core/src/main/java/net/ximatai/muyun/model/TreeNode.java b/muyun-core/src/main/java/net/ximatai/muyun/model/TreeNode.java index 5a2850a..e507425 100644 --- a/muyun-core/src/main/java/net/ximatai/muyun/model/TreeNode.java +++ b/muyun-core/src/main/java/net/ximatai/muyun/model/TreeNode.java @@ -55,4 +55,18 @@ public TreeNode setChildren(List children) { return this; } + @Override + public int hashCode() { + return getId().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof TreeNode node) { + return this.getId().equals(node.getId()); + } else { + return false; + } + } + } diff --git a/muyun-core/src/main/java/net/ximatai/muyun/util/TreeBuilder.java b/muyun-core/src/main/java/net/ximatai/muyun/util/TreeBuilder.java index 885027b..a90c3bc 100644 --- a/muyun-core/src/main/java/net/ximatai/muyun/util/TreeBuilder.java +++ b/muyun-core/src/main/java/net/ximatai/muyun/util/TreeBuilder.java @@ -1,10 +1,13 @@ package net.ximatai.muyun.util; +import net.ximatai.muyun.core.exception.MyException; import net.ximatai.muyun.model.TreeNode; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; public class TreeBuilder { @@ -35,8 +38,10 @@ public static List build(String pkColumn, String parentKeyColumn, List Map>> groupedByParentKey = list.stream() .collect(Collectors.groupingBy(item -> (String) item.get(parentKeyColumn))); + Set nodes = new HashSet<>(); + // 构建树形结构的递归方法 - List treeNodeList = buildChildren(groupedByParentKey, pkColumn, parentKeyColumn, rootID, labelColumn, 1, maxLevel); + List treeNodeList = buildChildren(groupedByParentKey, pkColumn, parentKeyColumn, rootID, labelColumn, 1, maxLevel, nodes); if (showMe) { if (rootID.equals(ROOT_PID)) { @@ -53,7 +58,7 @@ public static List build(String pkColumn, String parentKeyColumn, List } private static List buildChildren(Map>> groupedByParentKey, String pkColumn, String parentKeyColumn, - String currentRootID, String labelColumn, int currentLevel, int maxLevel) { + String currentRootID, String labelColumn, int currentLevel, int maxLevel, Set nodes) { if (currentLevel > maxLevel) { return Collections.emptyList(); // 超过最大层级,返回空列表 } @@ -68,9 +73,15 @@ private static List buildChildren(Map .setLabel((String) node.get(labelColumn)) .setData(node); + if (nodes.contains(treeNode)) { + throw new MyException("树节点出现递归调用"); + } else { + nodes.add(treeNode); + } + // 递归构建子节点 List childNodes = buildChildren(groupedByParentKey, pkColumn, parentKeyColumn, - (String) node.get(pkColumn), labelColumn, currentLevel + 1, maxLevel); + (String) node.get(pkColumn), labelColumn, currentLevel + 1, maxLevel, nodes); treeNode.setChildren(childNodes); return treeNode;