From c34912ac40c172065e1dd2a861b37076628d7109 Mon Sep 17 00:00:00 2001 From: panwangnan Date: Sat, 29 Jul 2023 00:28:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=9A=E8=BF=87=E6=A0=91?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E6=9E=84=E5=BB=BA=E4=B8=80=E4=B8=AA=E6=A0=91?= =?UTF-8?q?=E7=8A=B6=E7=BB=93=E6=9E=84=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/schbrain/common/util/TreeUtil.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 commons/common-util/src/main/java/com/schbrain/common/util/TreeUtil.java diff --git a/commons/common-util/src/main/java/com/schbrain/common/util/TreeUtil.java b/commons/common-util/src/main/java/com/schbrain/common/util/TreeUtil.java new file mode 100644 index 0000000..411f09f --- /dev/null +++ b/commons/common-util/src/main/java/com/schbrain/common/util/TreeUtil.java @@ -0,0 +1,65 @@ +package com.schbrain.common.util; + +import org.apache.commons.collections4.CollectionUtils; + +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.Function; + +/** + * 树工具类 + */ +public class TreeUtil { + + /** + * 通过列表构建一个树状结构 + * + * @param nodes 节点列表 + * @param idGetMethod 获取当前节点ID的方法 + * @param parentIdGetMethod 获取父节点ID的方法 + * @param setParentMethod 设置子节点列表的方法 + * @param parentId 父节点ID,可以为null + */ + public static List buildTree(List nodes, + Function idGetMethod, + Function parentIdGetMethod, + BiConsumer> setParentMethod, + K parentId) { + if (CollectionUtils.isEmpty(nodes)) { + return nodes; + } + Map> parentGroupMap = new HashMap<>(); + for (T node : nodes) { + K key = parentIdGetMethod.apply(node); + List subNodes = parentGroupMap.getOrDefault(key, new ArrayList<>()); + subNodes.add(node); + parentGroupMap.put(key, subNodes); + } + return buildTree(idGetMethod, setParentMethod, parentId, parentGroupMap); + } + + /** + * 递归通过列表构建一个树状结构 + * + * @param idGetMethod 获取当前节点ID的方法 + * @param setParentMethod 设置子节点列表的方法 + * @param parentId 父节点ID,可以为null + * @param parentGroupMap 存放节点下层节点列表的map + */ + private static List buildTree(Function idGetMethod, + BiConsumer> setParentMethod, + K parentId, Map> parentGroupMap) { + List nodes = parentGroupMap.get(parentId); + if (CollectionUtils.isEmpty(nodes)) { + return Collections.emptyList(); + } + nodes.forEach(item -> setParentMethod.accept(item, buildTree(idGetMethod, setParentMethod, idGetMethod.apply(item), parentGroupMap))); + return nodes; + } + +} + + + + + -- GitLab