当前位置: 移动技术网 > IT编程>开发语言>Java > java实现屏蔽词功能

java实现屏蔽词功能

2019年07月22日  | 移动技术网IT编程  | 我要评论

经常会看到贴吧里面屏蔽各种用户的发帖内容,当时就想这个该如何去实现。自己当时想过用字符串去替代的方式(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实现屏蔽词功能的关键代码,希望对大家的学习有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网