欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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实现屏蔽词功能的关键代码,希望对大家的学习有所帮助。