From bf0977445a4abf906306800f10b2f7f4f021eacc Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Sun, 14 Jan 2024 13:07:43 +0800 Subject: [PATCH] =?UTF-8?q?[feature]=20=E6=B7=BB=E5=8A=A0=E9=80=92?= =?UTF-8?q?=E5=BD=92=E6=89=81=E5=B9=B3=E5=8C=96WordTree=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E8=83=BD=E9=80=9A=E8=BF=87WordTree=E8=BF=98=E5=8E=9F?= =?UTF-8?q?=E6=88=90=E5=8E=9F=E6=9D=A5=E7=9A=84=E5=85=83=E7=B4=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/text/dfa/WordTree.java | 38 +++++++++++++++++++ .../dromara/hutool/core/text/dfa/DfaTest.java | 12 ++++++ 2 files changed, 50 insertions(+) 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); + } }