private class TrieNode{ /**
* 标识当前结点是否是一个“关键词”的最后一个结点
* true 关键词的终结 false 继续
*/
private boolean isEnd = false; /**
* 用map来存储当前结点的所有子节点,非常的方便
* key 下一个字符 value 对应的结点
*/
private Map 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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。