java实现屏蔽词功能
程序员文章站
2024-03-07 23:48:27
经常会看到贴吧里面屏蔽各种用户的发帖内容,当时就想这个该如何去实现。自己当时想过用字符串去替代的方式(replaceall)去实现,但是这种效率又非常低,也不能保证最长匹配...
经常会看到贴吧里面屏蔽各种用户的发帖内容,当时就想这个该如何去实现。自己当时想过用字符串去替代的方式(replaceall)去实现,但是这种效率又非常低,也不能保证最长匹配,这就是自己当时最初的想法。最近自己做的一个项目中,需要对一些内容做屏蔽,自己又对这个问题做了一次分析,最终形成下面的代码。
/** *@description: 屏蔽词功能实现 */ package cn.yicha.novel.search.util; import java.io.bufferedreader; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.ioexception; import java.io.inputstreamreader; import java.util.hashset; import cn.yicha.novel.search.config.config; public class forbidden { private static forbidden forbidden = new forbidden(); //屏蔽词hashset private hashset<string> keystring = new hashset<string>(); private final static int maxlength = character.max_value; //屏蔽词长度hashset数组 @suppresswarnings("unchecked") private hashset<integer>[] keylength = new hashset[maxlength]; private forbidden() { loadforbidden(config.getclassroot() + "forbidden.txt"); } public static forbidden getforbidden(){ return forbidden; } /** * @param str * @return * @description: 输入的字符串通过屏蔽处理,实现最大长度匹配 */ public string read(string str){ if (str == null){ return null; } stringbuffer stringbuffer = new stringbuffer(); int start = 0; for (int i = 0; i < str.length();){ int at = str.charat(i); if (keylength[at] == null){ i++; continue; } else { int ml = 0; for (object obj : keylength[at].toarray()){ int len = ((integer)obj).intvalue(); if (i + len <= str.length()){ string s = str.substring(i, i + len); if (keystring.contains(s)){ //最大长度匹配 ml = len > ml ? len : ml; } } } if (ml > 0){ stringbuffer.append(str.substring(start, i)).append("***"); i += ml; start = i; } else { i++; } } } if (start < str.length()){ stringbuffer.append(str.substring(start)); } return stringbuffer.tostring(); } /** * @param path * @description: 初始化加载屏蔽词 * @description: 存储屏蔽词的数据格式逻辑如下 * @description: 构建一个hashset<string>用于存储所有的屏蔽词 * @description: 构建长度为maxlength = character.max_value 的 hashset<integer>数组 * @description: 将加载的屏蔽中第一个字符转化成int值,即相关信息存储在数组中的位置, * @description: 如“你好呀”得到'你'的int值为20320,即“你好呀”相关信息存储在数组的第20320位置 * @description: 数组每一位存储的hashset<integer>结构存储在该位置的屏蔽词的长度 */ public void loadforbidden(string path){ file forbiddenfile = new file(path); fileinputstream fileinputstream; try { fileinputstream = new fileinputstream(forbiddenfile); inputstreamreader inputstreamreader = new inputstreamreader(fileinputstream, "utf-8"); bufferedreader bufferedreader = new bufferedreader(inputstreamreader); string s; while ((s = bufferedreader.readline()) != null){ s = s.trim(); if (s.length() > 0){ keystring.add(s); int i = s.charat(0); if (keylength[i] == null){ //屏蔽词长度hashset hashset<integer> a = new hashset<integer>(); a.add(s.length()); keylength[i] = a; } else { keylength[i].add(s.length()); } } } fileinputstream.close(); bufferedreader.close(); fileinputstream.close(); } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } public static void main(string[] args) { // system.out.println(forbidden.getforbidden().read("av女优nihao")); int i = '你'; system.out.println(i); } }
以上就是java实现屏蔽词功能的关键代码,希望对大家的学习有所帮助。