欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實(shí)現(xiàn)屏蔽詞功能

 更新時(shí)間:2015年12月30日 11:32:23   作者:xiaojimanman  
這篇文章主要介紹了java實(shí)現(xiàn)屏蔽詞功能,類似貼吧里面屏蔽各種用戶的發(fā)帖內(nèi)容,感興趣的小伙伴們可以參考一下

經(jīng)常會(huì)看到貼吧里面屏蔽各種用戶的發(fā)帖內(nèi)容,當(dāng)時(shí)就想這個(gè)該如何去實(shí)現(xiàn)。自己當(dāng)時(shí)想過用字符串去替代的方式(replaceAll)去實(shí)現(xiàn),但是這種效率又非常低,也不能保證最長(zhǎng)匹配,這就是自己當(dāng)時(shí)最初的想法。最近自己做的一個(gè)項(xiàng)目中,需要對(duì)一些內(nèi)容做屏蔽,自己又對(duì)這個(gè)問題做了一次分析,最終形成下面的代碼。

 /** 
 *@Description: 屏蔽詞功能實(shí)現(xiàn)  
 */ 
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; 
 //屏蔽詞長(zhǎng)度HashSet數(shù)組 
 @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: 輸入的字符串通過屏蔽處理,實(shí)現(xiàn)最大長(zhǎng)度匹配 
  */ 
 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)){ 
       //最大長(zhǎng)度匹配 
       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: 存儲(chǔ)屏蔽詞的數(shù)據(jù)格式邏輯如下 
  * @Description: 構(gòu)建一個(gè)HashSet<String>用于存儲(chǔ)所有的屏蔽詞 
  * @Description: 構(gòu)建長(zhǎng)度為maxLength = Character.MAX_VALUE 的 HashSet<Integer>數(shù)組 
  * @Description: 將加載的屏蔽中第一個(gè)字符轉(zhuǎn)化成int值,即相關(guān)信息存儲(chǔ)在數(shù)組中的位置, 
  * @Description: 如“你好呀”得到'你'的int值為20320,即“你好呀”相關(guān)信息存儲(chǔ)在數(shù)組的第20320位置 
  * @Description: 數(shù)組每一位存儲(chǔ)的HashSet<Integer>結(jié)構(gòu)存儲(chǔ)在該位置的屏蔽詞的長(zhǎng)度 
  */ 
 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){ 
      //屏蔽詞長(zhǎng)度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女優(yōu)nihao")); 
  int i = '你'; 
  System.out.println(i); 
 } 
} 

以上就是java實(shí)現(xiàn)屏蔽詞功能的關(guān)鍵代碼,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • Java判斷對(duì)象是否為空(包括null ,

    Java判斷對(duì)象是否為空(包括null ,"")的方法

    這篇文章主要介紹了Java判斷對(duì)象是否為空(包括null ,"")的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java中的集合工具類Collections詳解

    Java中的集合工具類Collections詳解

    這篇文章主要介紹了Java中的集合工具類Collections詳解,java.utils.Collections是集合工具類,用來(lái)對(duì)集合進(jìn)行操作,不是Collection集合的根接口,這個(gè)要區(qū)分開來(lái),需要的朋友可以參考下
    2024-01-01
  • Java讀取網(wǎng)頁(yè)內(nèi)容并下載圖片的實(shí)例

    Java讀取網(wǎng)頁(yè)內(nèi)容并下載圖片的實(shí)例

    這篇文章主要介紹了Java讀取網(wǎng)頁(yè)內(nèi)容并下載圖片的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-09-09
  • Java Http接口加簽、驗(yàn)簽操作方法

    Java Http接口加簽、驗(yàn)簽操作方法

    下面小編就為大家?guī)?lái)一篇Java Http接口加簽、驗(yàn)簽操作方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2016-11-11
  • SpringBoot中的@ConfigurationProperties注解解析

    SpringBoot中的@ConfigurationProperties注解解析

    這篇文章主要介紹了SpringBoot中的@ConfigurationProperties注解解析,Spring源碼中大量使用了ConfigurationProperties注解,通過與其他注解配合使用,能夠?qū)崿F(xiàn)Bean的按需配置,該注解可以放在類上,也可以放在方法上,需要的朋友可以參考下
    2023-11-11
  • Spring結(jié)合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信的教程詳解

    Spring結(jié)合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信的教程詳解

    WebSocket?是基于TCP/IP協(xié)議,獨(dú)立于HTTP協(xié)議的通信協(xié)議,本文將使用Spring結(jié)合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信功能,有需要的小伙伴可以參考一下
    2024-01-01
  • Java中不得不知的Collection接口與Iterator迭代器

    Java中不得不知的Collection接口與Iterator迭代器

    這篇文章主要介紹了Java中的Collection接口與Iterator迭代器,文中有詳細(xì)的代碼示例供大家參考,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-06-06
  • springboot如何獲取登錄用戶的個(gè)人信息

    springboot如何獲取登錄用戶的個(gè)人信息

    在Spring Boot中,獲取登錄用戶的個(gè)人信息通常需要使用Spring Security框架來(lái)進(jìn)行身份認(rèn)證和授權(quán),這篇文章主要介紹了springboot獲取登錄用戶的個(gè)人信息,需要的朋友可以參考下
    2023-05-05
  • Java Swing GroupLayout分組布局的實(shí)現(xiàn)代碼

    Java Swing GroupLayout分組布局的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java Swing GroupLayout分組布局的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • spring-boot-starter-validation?校驗(yàn)參數(shù)的實(shí)現(xiàn)

    spring-boot-starter-validation?校驗(yàn)參數(shù)的實(shí)現(xiàn)

    參數(shù)校驗(yàn)在很多地方都可以用到,本文主要介紹了spring-boot-starter-validation?校驗(yàn)參數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評(píng)論