学习了Java实现敏感词过滤后,一个微调整版。
public class SensitiveWordContainer { private final static String END_MARK = "isEnd"; private final static String END_STATE = "1"; private final static String CHILD_STATE = "0"; private Map container; private Set<String> words; public SensitiveWordContainer() { this.container=new ConcurrentHashMap(); } public SensitiveWordContainer(Set<String> words) { this.words = words; init(); } private void init() { container = new ConcurrentHashMap(words.size()); for (String word : words) { addSensitiveWord(word); } } public void addSensitiveWord(String word){ Map nowMap = container; for (int i = 0; i < word.length(); i++) { char keyChar = word.charAt(i); Object wordMap = nowMap.get(keyChar); if (wordMap != null) { nowMap = (Map) wordMap; } else { Map<String, String> newWorMap = new ConcurrentHashMap<>(); newWorMap.put(END_MARK, CHILD_STATE); nowMap.put(keyChar, newWorMap); nowMap = newWorMap; } if (i == word.length() - 1) { nowMap.put(END_MARK, END_STATE); } } } public void delSensitiveWord(String word){ Map nowMap = container; for (int i = 0; i < word.length(); i++) { char keyChar = word.charAt(i); Object wordMap = nowMap.get(keyChar); if (wordMap != null) { nowMap = (Map) wordMap; if (i == word.length() - 1) { if(END_STATE.equals(nowMap.get(END_MARK))){ nowMap.remove(END_MARK); } } } } } public boolean checkSensitiveWord(String txt) { boolean flag = false; for (int i = 0; i < txt.length(); i++) { //判断是否包含敏感字符 int matchFlag = this.doSensitiveWord(txt, i); //大于0存在,返回true if (matchFlag > 0) { flag = true; break; } } return flag; } private int doSensitiveWord(String txt, int beginIndex) { boolean flag = false; int matchFlag = 0; Map nowMap = container; for (int i = beginIndex; i < txt.length(); i++) { char word = txt.charAt(i); nowMap = (Map) nowMap.get(word); if (nowMap != null) { matchFlag++; //如果为最后一个匹配规则,结束循环,返回匹配标识数 if (END_STATE.equals(nowMap.get(END_MARK))) { flag = true; break; } } else { break; } } //长度必须大于等于1,为词 if (matchFlag < 2 || !flag) { matchFlag = 0; } return matchFlag; } public Map getContainer() { return container; } }