本来在项目中要做一个模糊查询 ,觉得前缀树查询不是太符合,只是符合精准查询,和前缀树查询,不过也可以做一个单个字符的查询匹配是否有匹配的,这个后边在完善,希望大家多多指点
public class TrieTree {
private class Node{
private boolean isWord;//判断是否是子节点
private HashMap<Character, Node> children; //当前节点拥有的子节点 使用hashmap存储
private Node(boolean isWord){
this.isWord = isWord;
this.children = new HashMap<>();
}
private Node(){
this(false);
}
}
private Node root;//trie树的根节点
private int size; // trie树中拥有多少分枝(多少个敏感词)
public TrieTree(){
this.root = new Node();
this.size = size;
}
public int getSize(){
return size;
}
public void addBranchesInTrie(String word){
Node cur = root;
char[] words = word.toCharArray();
for (char c:words){
if (!cur.children.containsKey(c)){
cur.children.put(c,new Node());// 如果不存在则将其添加进行子节点中
}
cur = cur.children.get(c);// 当前节点进行变换,变换为新插入到节点 c
}
if (!cur.isWord){//分支添加完成后,将分支最后一个节点设置成叶子节点
cur.isWord = true;
// 分枝数(敏感词数)加1
size++;
}
}
//全部包含
public boolean contains(String word){
Node cur = root;
char[] words = word.toCharArray();
for (char c: words){
if (!cur.children.containsKey(c)){
return false;
}
cur = cur.children.get(c);
}
// 如果存在并且遍历到trie树中某个分支最后一个节点了,那此节点就是叶子节点,直接返回true
return cur.isWord;
}
// 存放trie树中查询到的关联词
private List<String> list = new ArrayList<String>();
//查询有多少前缀匹配关联的词
public String likeSearch(String word){
Node cur = root;
char[] words = word.toCharArray();
StringBuilder str = new StringBuilder();
str.append(word);
for (char c: words){
if (Objects.nonNull(cur)){
if (!cur.children.containsKey(c)){
System.out.println("无关联的词");
};
cur = cur.children.get(c);
}
}
dfs(str, cur);
return Arrays.toString(list.toArray());
}
private void dfs(StringBuilder word, Node root) {
Node cur = root;
if (Objects.nonNull(cur)){
if (cur.isWord){//匹配的值加到集合
list.add(word.toString());
if (cur.children.size()==0){//如果没有子节点那就return
return;
}
}
for (char s: cur.children.keySet()){
word.append(s);
//递归调用
dfs(word, cur.children.get(s));
word.delete(word.length() - 1, word.length());
}
}
}
public static void main(String[] args) {
TrieTree trieTree = new TrieTree();
trieTree.addBranchesInTrie("hello world !!!!");
trieTree.addBranchesInTrie("hello world1111 !!!!");
trieTree.addBranchesInTrie("hello world11112222 !!!!");
System.out.println(trieTree.size);
System.out.println(trieTree.contains("hello world111"));
System.out.println(trieTree.likeSearch("hello"));
}
}