1.首先将基本模型构建出来
创建一个名为TrieNode的类,该类就是我们需要去完善形成的一个Trie的数据结构类。其中有一个Node内部类,Node用来代表Trie中的每一个节点,其中isWord表示首节点到该节点的路径是一个单词,next指向了下一个节点。
public class TrieNode {
//是不是敏感词的结尾
private boolean end = false;
//Character代表当前节点的字符,TrieNode代表了下一个节点
private Map<Character, TrieNode> subNodes = new HashMap<>();
public void addSubNode(Character key, TrieNode node) {
subNodes.put(key, node);
}
//查看下一个节点有没有对应的字符
TrieNode getNextSubNode(Character key) {
return subNodes.get(key);
}
boolean isEndWord() {
return end;
}
void setEndWord(boolean end) {
this.end = end;
}
}
2.构建添加敏感词方法
private TrieNode root = new TrieNode();
public void addWord(String word){
TrieNode tempNode = root;
for(int i = 0 ; i < word.length();i++){
Character c = word.charAt(i);
//判断该字符是否已存在
TrieNode node = tempNode.getNextSubNode(c);
//若不存在则添加
if(node == null){
node = new TrieNode();
tempNode.addSubNode(c,node);
}
tempNode = node;
if(i == word.length()-1){
tempNode.setEndWord(true);
}
}
}
3.构建过滤敏感词的方法
需要将待查询的word的每个字符遍历看是否存在,将传入的字符串中不是敏感词的就加入到StringBuilder中,如果是敏感词则用***代替。
public String filter(String words){
String replacement = "***";
TrieNode tempNode = root;
int position = 0;
StringBuilder result = new StringBuilder();
while(position < words.length()){
char c = words.charAt(position);
tempNode = tempNode.getNextSubNode(c);
//如果这个字符不在敏感词中则添加到结果中
if(tempNode == null){
result.append(words.charAt(position));
tempNode = root;
}else if(tempNode.isEndWord()){
//发现敏感词进行打码
result.append(replacement);
tempNode = root;
}
position++;
}
return result.toString();
}
4.测试代码
public class main {
public static void main(String[] args) {
Trie trie = new Trie();
trie.addWord("色情");
System.out.println(trie.filter("hello,色情"));
}
}