学习了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;
}
}