java实现屏蔽词功能
经常会看到贴吧里面屏蔽各种用户的发帖内容,当时就想这个该如何去实现。自己当时想过用字符串去替代的方式(replaceAll)去实现,但是这种效率又非常低,也不能保证最长匹配,这就是自己当时最初的想法。最近自己做的一个项目中,需要对一些内容做屏蔽,自己又对这个问题做了一次分析,最终形成下面的代码。
/** *@Description:屏蔽词功能实现 */ packagecn.yicha.novel.search.util; importjava.io.BufferedReader; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.IOException; importjava.io.InputStreamReader; importjava.util.HashSet; importcn.yicha.novel.search.config.Config; publicclassForbidden{ privatestaticForbiddenforbidden=newForbidden(); //屏蔽词HashSet privateHashSet<String>keyString=newHashSet<String>(); privatefinalstaticintmaxLength=Character.MAX_VALUE; //屏蔽词长度HashSet数组 @SuppressWarnings("unchecked") privateHashSet<Integer>[]keyLength=newHashSet[maxLength]; privateForbidden(){ loadForbidden(Config.getClassRoot()+"forbidden.txt"); } publicstaticForbiddengetForbidden(){ returnforbidden; } /** *@paramstr *@return *@Description:输入的字符串通过屏蔽处理,实现最大长度匹配 */ publicStringread(Stringstr){ if(str==null){ returnnull; } StringBufferstringBuffer=newStringBuffer(); intstart=0; for(inti=0;i<str.length();){ intat=str.charAt(i); if(keyLength[at]==null){ i++; continue; }else{ intml=0; for(Objectobj:keyLength[at].toArray()){ intlen=((Integer)obj).intValue(); if(i+len<=str.length()){ Strings=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)); } returnstringBuffer.toString(); } /** *@parampath *@Description:初始化加载屏蔽词 *@Description:存储屏蔽词的数据格式逻辑如下 *@Description:构建一个HashSet<String>用于存储所有的屏蔽词 *@Description:构建长度为maxLength=Character.MAX_VALUE的HashSet<Integer>数组 *@Description:将加载的屏蔽中第一个字符转化成int值,即相关信息存储在数组中的位置, *@Description:如“你好呀”得到'你'的int值为20320,即“你好呀”相关信息存储在数组的第20320位置 *@Description:数组每一位存储的HashSet<Integer>结构存储在该位置的屏蔽词的长度 */ publicvoidloadForbidden(Stringpath){ FileforbiddenFile=newFile(path); FileInputStreamfileInputStream; try{ fileInputStream=newFileInputStream(forbiddenFile); InputStreamReaderinputStreamReader=newInputStreamReader(fileInputStream,"utf-8"); BufferedReaderbufferedReader=newBufferedReader(inputStreamReader); Strings; while((s=bufferedReader.readLine())!=null){ s=s.trim(); if(s.length()>0){ keyString.add(s); inti=s.charAt(0); if(keyLength[i]==null){ //屏蔽词长度HashSet HashSet<Integer>a=newHashSet<Integer>(); a.add(s.length()); keyLength[i]=a; }else{ keyLength[i].add(s.length()); } } } fileInputStream.close(); bufferedReader.close(); fileInputStream.close(); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } publicstaticvoidmain(String[]args){ //System.out.println(Forbidden.getForbidden().read("AV女优nihao")); inti='你'; System.out.println(i); } }
以上就是java实现屏蔽词功能的关键代码,希望对大家的学习有所帮助。