add 删除指定违禁词功能,新增违禁词功能

This commit is contained in:
zl
2024-08-27 19:50:30 +08:00
parent c121bce3d2
commit 2bcf46c12e
3 changed files with 127 additions and 24 deletions

View File

@@ -21,6 +21,20 @@ public interface IWordData extends ISensitiveWordDestroy {
*/
void initWordData(Collection<String> collection);
/**
* 删除敏感词
* @param word
*/
default void removeWord(String word){
}
/**
* 新增敏感词
* @param collection
*/
void saveWordData(Collection<String> collection);
/**
* 是否包含敏感词
* @param stringBuilder 缓冲

View File

@@ -9,6 +9,8 @@ import com.github.houbb.sensitive.word.api.context.InnerSensitiveWordContext;
import com.github.houbb.sensitive.word.constant.enums.WordContainsTypeEnum;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* 敏感词 map
@@ -21,42 +23,89 @@ import java.util.Collection;
@ThreadSafe
public class WordDataTree implements IWordData {
/**
* 根节点
*/
private WordDataTreeNode root;
@Override
public synchronized void initWordData(Collection<String> collection) {
WordDataTreeNode newRoot = new WordDataTreeNode();
for(String word : collection) {
if(StringUtil.isEmpty(word)) {
for (String word : collection) {
if (StringUtil.isEmpty(word)) {
continue;
}
saveWord(newRoot, word);
WordDataTreeNode tempNode = newRoot;
char[] chars = word.toCharArray();
for (char c : chars) {
// 获取子节点
WordDataTreeNode subNode = tempNode.getSubNode(c);
if (subNode == null) {
subNode = new WordDataTreeNode();
// 加入新的子节点
tempNode.addSubNode(c, subNode);
}
// 临时节点指向子节点,进入下一次循环
tempNode = subNode;
}
// 设置结束标识(循环结束,设置一次即可)
tempNode.end(true);
}
// 初始化完成才做替换
this.root = newRoot;
}
/**
* 根节点
*/
private WordDataTreeNode root;
/**
* 新增敏感词
*
* @param collection
*/
@Override
public synchronized void saveWordData(Collection<String> collection) {
for (String word : collection) {
if (StringUtil.isEmpty(word)) {
continue;
}
saveWord(this.root, word);
}
}
@Override
public synchronized void removeWord(String word) {
if (StringUtil.isEmpty(word)) {
return;
}
WordDataTreeNode tempNode = root;
//需要删除的
Map<Character, WordDataTreeNode> map = new HashMap<>();
char[] chars = word.toCharArray();
int length = chars.length;
for (int i = 0; i < length; i++) {
//不存在第一个词
WordDataTreeNode subNode = tempNode.getSubNode(chars[i]);
if (subNode == null) {
return;
}
if (i == (length - 1)) {
//尾字符判断是否结束
if (!subNode.end()) {
return;
}
if (subNode.getNodeSize() > 0) {
//尾字符下还存在字符,即标识即可
subNode.end(false);
return;
}
}
if (subNode.end()) {
map.clear();
}
map.put(chars[i], tempNode);
tempNode = subNode;
}
for (Map.Entry<Character, WordDataTreeNode> entry : map.entrySet()) {
WordDataTreeNode value = entry.getValue();
//节点只有一个就置空
if (value.getNodeSize() == 1) {
value.clearNode();
return;
}
//多个就删除
value.removeNode(entry.getKey());
}
}
@Override
public WordContainsTypeEnum contains(StringBuilder stringBuilder,
@@ -123,4 +172,24 @@ public class WordDataTree implements IWordData {
this.root.destroy();
}
}
public void saveWord(WordDataTreeNode newRoot, String word) {
WordDataTreeNode tempNode = newRoot;
char[] chars = word.toCharArray();
for (char c : chars) {
// 获取子节点
WordDataTreeNode subNode = tempNode.getSubNode(c);
if (subNode == null) {
subNode = new WordDataTreeNode();
// 加入新的子节点
tempNode.addSubNode(c, subNode);
}
// 临时节点指向子节点,进入下一次循环
tempNode = subNode;
}
// 设置结束标识(循环结束,设置一次即可)
tempNode.end(true);
}
}

View File

@@ -38,6 +38,26 @@ public class WordDataTreeNode implements ISensitiveWordDestroy {
return subNodeMap.get(c);
}
public int getNodeSize() {
if (subNodeMap == null) {
return 0;
}
return subNodeMap.size();
}
public void clearNode() {
if (subNodeMap == null) {
return;
}
subNodeMap=null;
}
public void removeNode(final char c) {
if (subNodeMap == null) {
return;
}
subNodeMap.remove(c);
}
public WordDataTreeNode addSubNode(char c, WordDataTreeNode subNode) {
if(this.subNodeMap == null) {