!1154 [v6] 添加WordTree扁平化功能

Merge pull request !1154 from 阿超/v6-dev
This commit is contained in:
Looly 2024-01-15 09:24:22 +00:00 committed by Gitee
commit 283ebfdd7d
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
2 changed files with 50 additions and 0 deletions

View File

@ -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<Character, WordTree> {
}
return foundWords;
}
/**
* 扁平化WordTree
* 例如红领巾红河 构建树后为
* <pre>
*
* /\
*
* /
*
* </pre>
* 扁平化后得到
* <pre>
* 红河
* 红领巾
* </pre>
*
* @return 扁平化后的结果不保证顺序
*/
public List<String> flatten() {
return EasyStream.of(this.entrySet()).flat(this::innerFlatten).toList();
}
//--------------------------------------------------------------------------------------- Private method start
/**
* 递归扁平化WordTree每个entry节点
*
* @param entry WordTree每个entry节点
* @return 递归扁平化后的结果
*/
private Iterable<String> innerFlatten(Entry<Character, WordTree> entry) {
List<String> 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;
}
/**
* 是否末尾
*

View File

@ -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<String> list = Arrays.asList("阿帕奇", "阿超", "HuTool", "HuTao");
wordTree.addWords(list);
final List<String> flattened = wordTree.flatten();
flattened.sort(Comparator.comparingInt(list::indexOf));
Assertions.assertEquals(list, flattened);
}
}