java实现判断一个字符串是否包含特定关键词

现实当中可能遇到这样的问题:管理员需要配置一些关键字,如果用户发表的评论中包含这些关键字,就做一些处理。下面的这个类可以达到这个目的。

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,然后利用这个字典进行判断处理。如果此字典很大,建议在初始化此工具类时,就把它放入缓存中,以后就直接从缓存中取出,然后调用它的方法就行。

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值