import java.io.CharArrayWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Keyword{
private WordSeqPart rootWordSeqPart = new WordSeqPart();
@Override
public boolean isMatchKeyWord(String content) {
if (null == content) {
return false;
}
for (int i = 0; i < content.length(); i++) {
char c = content.charAt(i);
WordSeqPart wsp = rootWordSeqPart.getNextSeqPart(c, false);
if (null == wsp) {
continue;
}
CharArrayWriter caw = new CharArrayWriter();
caw.append(c);
if (wsp.isWordEnd()) {
logMatch(caw.toCharArray());
return true;
}
for (int j = i + 1; j < content.length(); j++) {
c = content.charAt(j);
wsp = wsp.getNextSeqPart(c, false);
if (null == wsp) {
break; // not match
} else {
caw.append(c);
if (wsp.isWordEnd()) {
logMatch(caw.toCharArray());
return true;
}
}
}
}
// 遍历了整个字符串,都没有命中
return false;
}
private void logMatch(char[] arry) {
//TODO log
}
public void setKeyWords(List<String> keyWords) {
if (null == keyWords) {
return;
}
for (String keyword : keyWords) {
WordSeqPart wsp = rootWordSeqPart;
for (int i = 0; i < keyword.length(); i++) {
char c = keyword.charAt(i);
wsp = wsp.getNextSeqPart(c, true);
}
wsp.setWordEnd(true);
}
}
private class WordSeqPart {
private Map<Character, WordSeqPart> nextSeqPartMap = new HashMap<Character, WordSeqPart>();
private boolean wordEnd;
WordSeqPart getNextSeqPart(char c, boolean toCreate) {
WordSeqPart wsp = nextSeqPartMap.get(c);
if (null != wsp) {
return wsp;
} else {
if (toCreate) {
wsp = new WordSeqPart();
nextSeqPartMap.put(c, wsp);
return wsp;
} else {
return null;
}
}
}
boolean isWordEnd() {
return wordEnd;
}
void setWordEnd(boolean wordEnd) {
this.wordEnd = wordEnd;
}
}
}