diff --git a/src/main/java/com/github/houbb/sensitive/word/api/IWordData.java b/src/main/java/com/github/houbb/sensitive/word/api/IWordData.java index 24cfab8..29f25f5 100644 --- a/src/main/java/com/github/houbb/sensitive/word/api/IWordData.java +++ b/src/main/java/com/github/houbb/sensitive/word/api/IWordData.java @@ -21,6 +21,20 @@ public interface IWordData extends ISensitiveWordDestroy { */ void initWordData(Collection collection); + /** + * 删除敏感词 + * @param word + */ + default void removeWord(String word){ + + } + + /** + * 新增敏感词 + * @param collection + */ + void saveWordData(Collection collection); + /** * 是否包含敏感词 * @param stringBuilder 缓冲 diff --git a/src/main/java/com/github/houbb/sensitive/word/support/data/WordDataTree.java b/src/main/java/com/github/houbb/sensitive/word/support/data/WordDataTree.java index 53c67a9..61ffa50 100644 --- a/src/main/java/com/github/houbb/sensitive/word/support/data/WordDataTree.java +++ b/src/main/java/com/github/houbb/sensitive/word/support/data/WordDataTree.java @@ -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 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 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 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 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); + } } diff --git a/src/main/java/com/github/houbb/sensitive/word/support/data/WordDataTreeNode.java b/src/main/java/com/github/houbb/sensitive/word/support/data/WordDataTreeNode.java index 95ee43c..dc5fa34 100644 --- a/src/main/java/com/github/houbb/sensitive/word/support/data/WordDataTreeNode.java +++ b/src/main/java/com/github/houbb/sensitive/word/support/data/WordDataTreeNode.java @@ -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) {