手记

分析一种前缀树的java实现

private class TrieNode{        /**         * 标识当前结点是否是一个“关键词”的最后一个结点         * true 关键词的终结 false 继续         */        private boolean isEnd = false;        /**         * 用map来存储当前结点的所有子节点,非常的方便         * key 下一个字符 value 对应的结点         */        private Map<Character , TrieNode> subNodes = new HashMap<>();        /**         * 向指定位置添加结点树         * @param key         * @param node         */        public void addSubNode(Character key , TrieNode node){            subNodes.put(key , node);        }        /**         * 根据key获得相应的子节点         * @param key         * @return         */        public TrieNode getSubNode(Character key){            return subNodes.get(key);        }        //判断是否是关键字的结尾        public boolean isKeyWordEnd(){            return isEnd;        }        //设置为关键字的结尾        public void setKeyWordEnd(boolean isEnd){            this.isEnd = isEnd;        }    }     /**     * 核心算法一:构建字典树     * 根据输入的字符串,逐步构建字典树     * @param textLine     */    private void addDirTreeNode(String textLine){        //边界处理        if(textLine == null)            return;        //临时结点指向根结点        TrieNode tempNode = root;        for(int i = 0; i < textLine.length(); i++){            char charWord = textLine.charAt(i);            //直接跳过非法文字            if (isSymbol(charWord))                continue;            TrieNode node = tempNode.getSubNode(charWord);            if (node == null){                //说明tempNode第一次碰到该关键字结点                node = new TrieNode();                tempNode.addSubNode(charWord , node);            }            //tempNode指向下一个结点,开始下一次循环            tempNode = node;            //到敏感词的最后一个字时,标记为红色(关键词结尾)            if (i == textLine.length() - 1)                tempNode.setKeyWordEnd(true);        }    }



作者:芥末无疆sss
链接:https://www.jianshu.com/p/b5c4c556000b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


0人推荐
随时随地看视频
慕课网APP