diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/text/dfa/WordTree.java b/hutool-core/src/main/java/org/dromara/hutool/core/text/dfa/WordTree.java index 6ed5423fa..e7e405e3d 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/text/dfa/WordTree.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/text/dfa/WordTree.java @@ -15,6 +15,7 @@ package org.dromara.hutool.core.text.dfa; import org.dromara.hutool.core.collection.CollUtil; import org.dromara.hutool.core.collection.set.SetUtil; import org.dromara.hutool.core.map.MapUtil; +import org.dromara.hutool.core.stream.EasyStream; import org.dromara.hutool.core.text.StrUtil; import java.util.*; @@ -324,8 +325,45 @@ public class WordTree extends HashMap { } return foundWords; } + + /** + * 扁平化WordTree + * 例如:红领巾,红河 构建树后为: + *
+	 *            红
+	 *            /\
+	 *          领  河
+	 *         /
+	 *       巾
+	 * 
+ * 扁平化后得到 + *
+	 *     红河
+	 *     红领巾
+	 * 
+ * + * @return 扁平化后的结果,不保证顺序 + */ + public List flatten() { + return EasyStream.of(this.entrySet()).flat(this::innerFlatten).toList(); + } + //--------------------------------------------------------------------------------------- Private method start + /** + * 递归扁平化WordTree每个entry节点 + * + * @param entry WordTree每个entry节点 + * @return 递归扁平化后的结果 + */ + private Iterable innerFlatten(Entry entry) { + List list = EasyStream.of(entry.getValue().entrySet()).flat(this::innerFlatten).map(v -> entry.getKey() + v).toList(); + if (list.isEmpty()) { + return EasyStream.of(entry.getKey().toString()); + } + return list; + } + /** * 是否末尾 * diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/text/dfa/DfaTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/text/dfa/DfaTest.java index ff1c1f30b..bf58e0a07 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/text/dfa/DfaTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/text/dfa/DfaTest.java @@ -16,6 +16,8 @@ import org.dromara.hutool.core.collection.ListUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.Comparator; import java.util.List; /** @@ -209,4 +211,14 @@ public class DfaTest { strings = wordTree.matchAll("abab", -1, true, true); Assertions.assertEquals("[ab, b, ab, b]", strings.toString()); } + + @Test + void flattenTest() { + final WordTree wordTree = new WordTree(); + final List list = Arrays.asList("阿帕奇", "阿超", "HuTool", "HuTao"); + wordTree.addWords(list); + final List flattened = wordTree.flatten(); + flattened.sort(Comparator.comparingInt(list::indexOf)); + Assertions.assertEquals(list, flattened); + } }