From bdbd0d0730320333f8b9bb30442c57b01d90802d Mon Sep 17 00:00:00 2001 From: bioxygenrich25 Date: Thu, 29 May 2025 15:48:48 +0800 Subject: [PATCH] =?UTF-8?q?TreeUtil=E5=A2=9E=E5=8A=A0=E6=96=B9=E6=B3=95toT?= =?UTF-8?q?reeView#=E5=B0=86=E6=8B=A5=E6=9C=89=E5=AD=90=E7=88=B6=E7=BA=A7?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E7=9A=84=E6=A8=AA=E5=90=91=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E8=BD=AC=E6=88=90=E5=AD=90=E7=88=B6=E7=BA=A7=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E7=9A=84=E6=A0=91=E5=BD=A2=E5=88=97=E8=A1=A8@=E9=99=84?= =?UTF-8?q?=E5=B8=A6=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95TreeUtilTest=20Str?= =?UTF-8?q?Util=E5=A2=9E=E5=8A=A0=E6=96=B9=E6=B3=95removeAllBrackets#?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E6=89=80?= =?UTF-8?q?=E6=9C=89=E7=9A=84=E6=8B=AC=E5=8F=B7(=E6=94=B9=E7=94=A8?= =?UTF-8?q?=E6=AD=A3=E5=88=99)@=E9=99=84=E5=B8=A6=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95StrUtilTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/lang/tree/TreeUtil.java | 59 +++++++++++++++++++ .../java/cn/hutool/core/util/StrUtil.java | 13 ++++ .../java/cn/hutool/core/util/StrUtilTest.java | 12 ++++ .../cn/hutool/core/util/TreeUtilTest.java | 36 +++++++++++ 4 files changed, 120 insertions(+) create mode 100644 hutool-core/src/test/java/cn/hutool/core/util/TreeUtilTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java index 317b1af4c..faa0f0083 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java @@ -1,5 +1,6 @@ package cn.hutool.core.lang.tree; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.IterUtil; import cn.hutool.core.lang.tree.parser.DefaultNodeParser; import cn.hutool.core.lang.tree.parser.NodeParser; @@ -329,4 +330,62 @@ public class TreeUtil { }); setChildFunc.accept(root, children); } + + + + /** + * 将拥有子父级字段的横向列表转成子父级结构的树形列表 + * + *

例:

+ * + * @param totalList 总列表(需要树形化的所有数据组成的列表) + * @param rootList 根列表(顶级无父级,只包含最顶级的节点列表) + * @param parentKey 父级关联的字段名(列表元素中都需要有该字段eg: parentId/parentCode/parentKey) + * @param slfKey 列表对象中具备唯一性的字段名(eg:pkId,id,uniqueKey,code......etc.) + * @param childListFieldName 子列表的字段名(子列表应为clazz对象的成员变量eg: childList/child/children/subList......etc.) + * @throws RuntimeException 入参的list元素对象的属性字段名不一致或者parentKey与slfKey对应的字段为空 + * @return 树形后的列表 + * @author bioxygenrich25 + */ + public static List> toTreeView(List totalList, List rootList, String parentKey, String slfKey, String childListFieldName) { + List> treeNodes = new ArrayList<>(); + try { + for (Object treeRootNode : rootList) { + treeRootNode = buildChildTree(BeanUtil.beanToMap(treeRootNode), totalList, parentKey, slfKey, childListFieldName); + treeNodes.add((Map) treeRootNode); + } + } catch (Exception e) { + throw new RuntimeException("check whether the list fields are consistent with each other."); + } + return treeNodes; + } + + private static Map buildChildTree(Map pNode, List nodeList, String parentKey, String slfKey, String childKey) { + Map pMap = BeanUtil.beanToMap(pNode); + List childTree = new ArrayList<>(); + for (Object treeNode : nodeList) { + Map tMap = BeanUtil.beanToMap(treeNode); + if (tMap.get(parentKey).equals(pMap.get(slfKey))) { + childTree.add(buildChildTree(BeanUtil.beanToMap(treeNode), nodeList, parentKey, slfKey, childKey)); + } + } + pMap.put(childKey, childTree); + return pMap; + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java index 24c282a8c..a191a54ba 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java @@ -541,4 +541,17 @@ public class StrUtil extends CharSequenceUtil implements StrPool { } return result; } + + /** + * 移除字符串中所有的括号 + * @param str 原始字符串 + * @return 返回移除后的字符串 + * @author bioxygenrich25 + */ + public static String removeAllBrackets(String str) { + if (isBlank(str)) { + return str; + } + return str.replaceAll("[()\\[\\]{}<>()【】《》]", ""); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java index 81435d3e7..466d5fd96 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java @@ -1,5 +1,6 @@ package cn.hutool.core.util; +import cn.hutool.core.lang.Console; import cn.hutool.core.lang.Dict; import org.junit.jupiter.api.Test; @@ -15,6 +16,17 @@ import static org.junit.jupiter.api.Assertions.*; */ public class StrUtilTest { + + @Test + public void removeAllBrackets() { + String r = "[111]"; + Console.log(StrUtil.removeAllBrackets(r)); + r = "{222}"; + Console.log(StrUtil.removeAllBrackets(r)); + r = "(圆|)[方|]{花|}(中圆|)《书|》<尖|>【000|】"; + Console.log(StrUtil.removeAllBrackets(r)); + } + @Test public void isBlankTest() { final String blank = "   "; diff --git a/hutool-core/src/test/java/cn/hutool/core/util/TreeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/TreeUtilTest.java new file mode 100644 index 000000000..6920716cf --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/util/TreeUtilTest.java @@ -0,0 +1,36 @@ +package cn.hutool.core.util; + +import cn.hutool.core.lang.Console; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @since 2025/5/28 11:09 + */ +public class TreeUtilTest { + + @Test + public void toTreeViewTest() { + List allList = new ArrayList<>(); + allList.add(new TreeNode(10, 0, "level1", null)); + allList.add(new TreeNode(11, 0, "level1", null)); + allList.add(new TreeNode(12, 10, "level2", null)); + allList.add(new TreeNode(13, 10, "level2", null)); + allList.add(new TreeNode(14, 13, "level3", null)); + + List rootList = new ArrayList<>(); + rootList.add(new TreeNode(10, 0, "level1", null)); + rootList.add(new TreeNode(11, 0, "level1", null)); + + List> treeList = TreeUtil.toTreeView(allList, rootList, "parentId", "id", "children"); + Console.log(treeList); + Console.log(treeList.size()); + } +}