前缀数在项目中使用例子

本来在项目中要做一个模糊查询 ,觉得前缀树查询不是太符合,只是符合精准查询,和前缀树查询,不过也可以做一个单个字符的查询匹配是否有匹配的,这个后边在完善,希望大家多多指点

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"));
    }

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值