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