现实当中可能遇到这样的问题:管理员需要配置一些关键字,如果用户发表的评论中包含这些关键字,就做一些处理。下面的这个类可以达到这个目的。
package com.syz.util;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class KeyWordUtil {
private Map<String, Object> dictionaryMap;
public KeyWordUtil(Set<String> wordSet) {
this.dictionaryMap = handleToMap(wordSet);
}
public Map<String, Object> getDictionaryMap() {
return dictionaryMap;
}
public void setDictionaryMap(Map<String, Object> dictionaryMap) {
this.dictionaryMap = dictionaryMap;
}
@SuppressWarnings("unchecked")
private Map<String, Object> handleToMap(Set<String> wordSet) {
if (wordSet == null) {
return null;
}
Map<String, Object> map = new HashMap<String, Object>(wordSet.size());
Map<String, Object> curMap = null;
Iterator<String> ite = wordSet.iterator();
while (ite.hasNext()) {
String word = ite.next();
curMap = map;
int len = word.length();
for (int i = 0; i < len; i++) {
String key = String.valueOf(word.charAt(i));
Map<String, Object> wordMap = (Map<String, Object>) curMap
.get(key);
if (wordMap == null) {
wordMap = new HashMap<String, Object>();
wordMap.put("isEnd", "0");
curMap.put(key, wordMap);
curMap = wordMap;
}
else {
curMap = wordMap;
}
if (i == len - 1) {
curMap.put("isEnd", "1");
}
}
}
return map;
}
@SuppressWarnings("unchecked")
public int checkWord(String text, int beginIndex) {
if (dictionaryMap == null) {
throw new RuntimeException("字典不能为空!");
}
boolean isEnd = false;
int wordLength = 0;
Map<String, Object> curMap = dictionaryMap;
int len = text.length();
for (int i = beginIndex; i < len; i++) {
String key = String.valueOf(text.charAt(i));
curMap = (Map<String, Object>) curMap.get(key);
if (curMap == null) {
break;
}
else {
wordLength++;
if ("1".equals(curMap.get("isEnd"))) {
isEnd = true;
}
}
}
if (!isEnd) {
wordLength = 0;
}
return wordLength;
}
public Set<String> getWords(String text) {
Set<String> wordSet = new HashSet<String>();
int len = text.length();
for (int i = 0; i < len; i++) {
int wordLength = checkWord(text, i);
if (wordLength > 0) {
String word = text.substring(i, i + wordLength);
wordSet.add(word);
i = i + wordLength - 1;
}
}
return wordSet;
}
public static void main(String[] args) {
Set<String> wordSet = new HashSet<String>();
wordSet.add("叶良辰");
wordSet.add("叶良辰的");
wordSet.add("叶良辰的人");
wordSet.add("叶良辰的兄弟");
wordSet.add("良辰");
wordSet.add("良辰不");
wordSet.add("呵呵");
KeyWordUtil keyWordUtil = new KeyWordUtil(wordSet);
Map<String, Object> map = keyWordUtil.getDictionaryMap();
System.out.println(map);
String text = "不错,我就是叶良辰。你的行为实在欺人太甚,你若是感觉有实力跟我玩,良辰不介意奉陪到底。呵呵,我会让你明白,良辰从不说空话。";
int beginIndex = 6;
int wordLength = keyWordUtil.checkWord(text, beginIndex);
System.out.println(wordLength);
System.out.println(keyWordUtil.getWords(text));
}
}
测试结果:
{叶={isEnd=0, 良={isEnd=0, 辰={isEnd=1, 的={isEnd=1, 兄={isEnd=0, 弟={isEnd=1}}, 人={isEnd=1}}}}}, 良={isEnd=0, 辰={isEnd=1, 不={isEnd=1}}}, 呵={isEnd=0, 呵={isEnd=1}}}
3
[叶良辰, 良辰, 呵呵, 良辰不]
当然还可以在此基础上加一些其它功能,如某个关键字出现多少次啊,替换关键字为星号符啊。
这个工具类的核心是创建一个字典HashMap,然后利用这个字典进行判断处理。如果此字典很大,建议在初始化此工具类时,就把它放入缓存中,以后就直接从缓存中取出,然后调用它的方法就行。