简单的敏感词汇实现

import java.util.HashMap;
import java.util.Map;

public class Main {
    class TreeNode {

        //当前节点的所有子节点
        public Map<Character, TreeNode> subNodes = new HashMap();
        //判断当前树的结尾,即敏感词汇的结束
        private boolean end = false;//如果是true 就结束,否则继续往下判断

        //添加敏感词构造的的树
        public void addSubNodes(Character c, TreeNode node) {
            subNodes.put(c, node);
        }

        //获取树节点
        public TreeNode getTreeNode(Character c) {
            return subNodes.get(c);
        }

        //判断当前字符是否为敏感词
        public boolean iskeyWords(Character c) {
            return end;
        }

        //设置敏感词的结束
        public void setKeyWords(boolean end) {
            this.end = end;
        }

        //获取当前结点子节点的数量
        public int getSubNodeCount() {
            return subNodes.size();
        }

    }

    TreeNode rootNode = new TreeNode();//建立树,空树

    /**
     * 将敏感词汇添加到树中
     */
    public void addWords(String TextLine) {
        TreeNode tempNode = rootNode;

    /* 这里面可以添加一些对传入字符串的过滤*/
        for (int i = 0; i < TextLine.length(); ++i) {
            Character c = TextLine.charAt(i);
            TreeNode node = tempNode.getTreeNode(c);
            if (node == null) {//树的初始化
                node = new TreeNode();
                tempNode.addSubNodes(c, node);
            }
            tempNode = node;
            if (TextLine.length() - 1 == i) {
                //如果敏感词汇结束,就是设置end为ture
                tempNode.setKeyWords(true);
            }
        }
    }
    /**
     * 过滤敏感词的方法
     */
    public String filter(String message) {

        String REPLACEMENT = "*";//替换词
        TreeNode tempNode = rootNode;
        StringBuilder sb = new StringBuilder();//输出容器

        int begin = 0; //起始点
        int postion = 0;//当前活动节点

        //开始过滤
        while (postion < message.length()) {
            char c = message.charAt(postion);
            tempNode = tempNode.getTreeNode(c);
            if (tempNode == null) {
                //说明当前匹配已经结束
                sb.append(c);
                postion = begin + 1;
                begin = postion;
                tempNode = rootNode;
            } else if (tempNode.iskeyWords(c)) {
                for(int i = begin;i<=postion;++i){
                    sb.append(REPLACEMENT);
                }
                postion++;
                begin = postion;
            } else {
                ++postion;
            }

        }
        sb.append(message.substring(begin));
        return sb.toString();
    }

    public static void main(String args[]) {

        Main s = new Main();
        s.addWords("色情");//输入敏感词汇
        s.addWords("好色");
        System.out.print(s.filter("你好色情"));//输入要过滤的语句

    }
}

原文地址:https://www.cnblogs.com/shuoli/p/7425376.html