From 629507cbaff8aca2cac22cf45eda4af188027b9b Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 11 Aug 2022 21:06:32 +0800 Subject: [PATCH] fix code --- .../main/java/cn/hutool/core/tree/Tree.java | 44 ++++++++-- .../java/cn/hutool/core/tree/TreeUtil.java | 82 ++----------------- .../java/cn/hutool/core/tree/TreeTest.java | 12 +++ 3 files changed, 57 insertions(+), 81 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/tree/Tree.java b/hutool-core/src/main/java/cn/hutool/core/tree/Tree.java index ce7762bde..19674a0a7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/tree/Tree.java +++ b/hutool-core/src/main/java/cn/hutool/core/tree/Tree.java @@ -11,7 +11,10 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; +import java.util.Queue; +import java.util.Stack; import java.util.function.Consumer; import java.util.function.Predicate; @@ -187,16 +190,47 @@ public class Tree extends LinkedHashMap implements Node { } /** - * 递归树并处理子树下的节点: + * 递归树并处理子树下的节点,采用深度优先遍历方式。 * * @param consumer 节点处理器 * @since 5.7.16 */ public void walk(final Consumer> consumer) { - consumer.accept(this); - final List> children = getChildren(); - if (CollUtil.isNotEmpty(children)) { - children.forEach((tree) -> tree.walk(consumer)); + walk(consumer, false); + } + + /** + * 递归树并处理子树下的节点 + * + * @param consumer 节点处理器 + * @param broadFirst 是否广度优先遍历 + * @since 6.0.0 + */ + public void walk(final Consumer> consumer, final boolean broadFirst) { + if (broadFirst) { // 广度优先遍历 + // 加入FIFO队列 + final Queue> queue = new LinkedList<>(); + queue.offer(this); + while (false == queue.isEmpty()) { + final Tree node = queue.poll(); + consumer.accept(node); + final List> children = node.getChildren(); + if (CollUtil.isNotEmpty(children)) { + children.forEach(queue::offer); + } + } + } else { // 深度优先遍历 + // 入栈,FILO + final Stack> stack = new Stack<>(); + stack.add(this); + while (false == stack.isEmpty()) { + final Tree node = stack.pop(); + consumer.accept(node); + final List> children = node.getChildren(); + if (CollUtil.isNotEmpty(children)) { + children.forEach(stack::push); + } + } } } diff --git a/hutool-core/src/main/java/cn/hutool/core/tree/TreeUtil.java b/hutool-core/src/main/java/cn/hutool/core/tree/TreeUtil.java index 3537f3815..a93c7be15 100644 --- a/hutool-core/src/main/java/cn/hutool/core/tree/TreeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/tree/TreeUtil.java @@ -6,12 +6,9 @@ import cn.hutool.core.tree.parser.NodeParser; import cn.hutool.core.util.ObjUtil; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Queue; -import java.util.Stack; /** * 树工具类 @@ -241,88 +238,21 @@ public class TreeUtil { return new Tree().setId(id); } - /** - * 深度优先,遍历森林,将森林转换为数组 - * - * @param forest 森林 - * @param 节点ID类型 - * @return 森林所有节点列表 - */ - public static List> deepFirstForestConvertToList(List> forest) { - if (CollUtil.isEmpty(forest)) { - return null; - } - List> list = new ArrayList<>(); - forest.forEach(root -> list.addAll(Objects.requireNonNull(deepFirstTreeConvertToList(root)))); - return list; - } - - /** - * 广度优先,遍历森林,将森林转换为数组 - * - * @param forest 森林 - * @param 节点ID类型 - * @return 森林所有节点列表 - */ - public static List> broadFirstForestConvertToList(List> forest) { - if (CollUtil.isEmpty(forest)) { - return null; - } - List> list = new ArrayList<>(); - forest.forEach(root -> list.addAll(Objects.requireNonNull(broadFirstTreeConvertToList(root)))); - return list; - } - - /** * 深度优先,遍历树,将树换为数组 * - * @param root 树的根节点 - * @param 节点ID类型 + * @param root 树的根节点 + * @param broadFirst 是否广度优先遍历 + * @param 节点ID类型 * @return 树所有节点列表 */ - public static List> deepFirstTreeConvertToList(Tree root) { + public static List> toList(final Tree root, final boolean broadFirst) { if (Objects.isNull(root)) { return null; } + final List> list = new ArrayList<>(); + root.walk(list::add, broadFirst); - // 入栈,FILO - List> list = new ArrayList<>(); - Stack> stack = new Stack<>(); - stack.add(root); - while (!stack.isEmpty()) { - Tree node = stack.pop(); - list.add(node); - if (node.hasChild()) { - node.getChildren().forEach(stack::push); - } - } - return list; - } - - /** - * 广度优先,遍历树,将树转换为数组 - * - * @param root 树的根节点 - * @param 节点ID类型 - * @return 树所有节点列表 - */ - public static List> broadFirstTreeConvertToList(Tree root) { - if (Objects.isNull(root)) { - return null; - } - - // 加入FIFO队列 - List> list = new ArrayList<>(); - Queue> queue = new LinkedList<>(); - queue.offer(root); - while (!queue.isEmpty()) { - Tree node = queue.poll(); - list.add(node); - if (node.hasChild()) { - node.getChildren().forEach(queue::offer); - } - } return list; } } diff --git a/hutool-core/src/test/java/cn/hutool/core/tree/TreeTest.java b/hutool-core/src/test/java/cn/hutool/core/tree/TreeTest.java index 693017ad9..489db4fc8 100755 --- a/hutool-core/src/test/java/cn/hutool/core/tree/TreeTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/tree/TreeTest.java @@ -1,6 +1,7 @@ package cn.hutool.core.tree; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.lang.Console; import org.junit.Assert; import org.junit.Test; @@ -77,6 +78,17 @@ public class TreeTest { Assert .assertEquals(7, ids.size()); } + @Test + public void walkBroadFirstTest(){ + final List ids = new ArrayList<>(); + final Tree tree = TreeUtil.buildSingle(nodeList, "0"); + Console.log(tree); + tree.walk((tr)-> ids.add(tr.getId()), true); + + Console.log(ids); + Assert .assertEquals(7, ids.size()); + } + @Test public void cloneTreeTest(){ final Tree tree = TreeUtil.buildSingle(nodeList, "0");