java实现屏蔽词功能

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

(0)

相关推荐

  • 屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法

    在IE6中范例代码如下:window.opener= null;window.close(); 在IE7中示例代码如下: window.opener= null;window.open("","_self"); window.close(); 如果要全屏显示(去掉IE的工具栏.地址栏和菜单栏等信息),则只能用window.open();的方法.如果第一个页面就要全屏显示,则需要设置一个中转页面.中转页面代码如下:(body中什么都不必写) 复制代码 代码如下: &l

  • js退弹 IE关闭时弹出广告代码,可以防止屏蔽

    在网上寻觅了很久JS退弹代码,也没有找出让人非常满意的代码.于是今天把收集的退弹代码做了一下整理,精简出一个非常短小精悍而强力的JS退弹代码,能够突破现在绝大多数浏览器的限制,包括SP2.IE6.IE7.遨游.MYIE等等. 现提供给有这方面需求的用户: 完整版24小时只弹一次的代码 复制代码 代码如下: function Get(){ var Then = new Date() Then.setTime(Then.getTime() + 24*60*60*1000) //这里是24小时,如果想

  • PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子

    在PHP程序运行过程中如果有错误发生,在浏览器上是否显示错误信息,以及显示错误信息的级别是我们在程序开发.调试.运营过程中需要控制的.下面就通过设置php.ini,控制PHP错误信息(errors)的屏蔽和显示作如下说明:1.错误信息是否显示     复制代码 代码如下: 显示错误 display_errors = On     屏蔽错误 display_errors = Off (缺省值) 2.显示错误信息的级别     复制代码 代码如下: error_reporting = E_ALL (

  • javascript 容错处理代码(屏蔽js错误)

    国外银行页面就是因为这样的错误,导致用户大量流失不敢用这个银行的网上银行等导致损失惨重. 所以一个想要在用户体验与公司实力上都是不容出现的错误,就是不影响使用也不能让用户反感,我们一直致力于为大家提高更好的代码,所以这里我们将会大家整理一些常用的代码,使用方法什么,希望大家以后能越来越支持我们,让我们共同发展. 第一种:我们自己也在用的 复制代码 代码如下: <SCRIPT language=javascript> <!-- window.onerror=function(){retur

  • Android开发笔记之:如何屏蔽Button setClickable与setEnabled

    今天想让按键暂时无效,满足一定条件下才可以被用户按到.最初以为是setClickable,谁知搞错了.请看手册: 复制代码 代码如下: public void setClickable (boolean clickable)Since: API Level 14Sets whether this node is clickable.Note: Cannot be called from an AccessibilityService. This class is made immutable b

  • 清除网页历史记录,屏蔽后退按钮!

    本文介绍网络上可找到的各种禁用浏览器后退按钮方案,分析它们各自的优缺点和适 用场合.一.概述 曾经有许多人问起,"怎样才能'禁用'浏览器的后退按钮?",或者"怎样才能防止用户点击后退按钮返回以前浏 览过的页面?"在ASP论坛上,这个问题也是问得最多的问题之一.遗憾的是,答案非常简单:我们无法禁用浏览器的后退 按钮. 起先我对于居然有人想要禁用浏览器的后退按钮感到不可思议.后来,看到竟然有那么多的人想要禁用这个后退按 钮,我也就释然(想要禁用的只有后退按钮,不包括浏览

  • PHP中error_reporting()函数的用法(修改PHP屏蔽错误)

    今天学习CI框架过程中遇到个问题: A PHP Error was encountered Severity: Notice Message: Undefined variable: user 一般在默认的普通PHP文件中输出一个未定义声明的变量是不会报错误的,但在codeigniter框架下却要报错误,这对于想集成 添加 和 修改 页面于一体的"懒人"很不方便,由于是初学者开始还想怎么在代码中屏蔽这一错误提示呢.甚至用到了@,但听很多人都说@会大大降低性能-. 最后突然想到,是不是c

  • 深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制

    我记得在刚开始接触动态HTML及JavaScript时就接触过关于鼠标右键屏蔽的脚本代码,当时这些代码很多会用在防止浏览者未经允许的复制网页上的文字或者其他内容,后来的实际应用证明这种做法是不符合用户体验的,而且破解的方法也有很多,比如我曾经写过一篇文章讲解如何解除网页禁止复制的办法. 由此可见,限制右键及复制是不明智的做法,但是今天我仍然要谈谈关于禁止网页复制.右键菜单的事儿,因为随着网页APP技术的发展,网页应用和桌面应用之间的界限越来越模糊,有一些桌面程序实际上是由网页配合JavaScri

  • java实现屏蔽词功能

    经常会看到贴吧里面屏蔽各种用户的发帖内容,当时就想这个该如何去实现.自己当时想过用字符串去替代的方式(replaceAll)去实现,但是这种效率又非常低,也不能保证最长匹配,这就是自己当时最初的想法.最近自己做的一个项目中,需要对一些内容做屏蔽,自己又对这个问题做了一次分析,最终形成下面的代码. /** *@Description: 屏蔽词功能实现 */ package cn.yicha.novel.search.util; import java.io.BufferedReader; impo

  • Java实现敏感词过滤实例

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来一看,整个过程如下:读取敏感词库.如果HashSet集合中,获取页面上传文字,然后进行匹配.我就想这个过程肯定是非常慢的.对于他这个没有接触的人来说我想也只能想到这个,更高级点就是正则表达式.但是非常遗憾,这两种方法都是不可行的.当然,在我意识里没有我也没有认知到那个算法可以解决问题,但是Googl

  • Java实现FTP服务器功能实例代码

    FTP(File Transfer Protocol 文件传输协议)是Internet 上用来传送文件的协议.在Internet上通过FTP 服务器可以进行文件的上传(Upload)或下载(Download).FTP是实时联机服务,在使用它之前必须是具有该服务的一个用户(用户名和口令),工作时客户端必须先登录到作为服务器一方的计算机上,用户登录后可以进行文件搜索和文件传送等有关操作,如改变当前工作目录.列文件目录.设置传输参数及传送文件等.使用FTP可以传送所有类型的文件,如文本文件.二进制可执

  • Java简单验证身份证功能示例

    本文实例讲述了Java简单验证身份证功能.分享给大家供大家参考,具体如下: package org.cxy.csdn.example; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import javax.xml.bind.Validator; /** * 身份证验证的工具(支持5位或18位省份证)<br/> * 身份证号码结构: * <ol> * <li>17位数

  • Java 实现随机验证码功能简单实例

    Java 实现随机验证码功能简单实例 现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用. 验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度. 在这里,我们使用servlet来实现随机验证码的实现.  实现代码: p

  • Java实现验证码验证功能

    Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢? Java实现验证码验证功能其实非常简单:用到了一个Graphics类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线. 首先,写一个验证码生成帮助类,用来绘制随机字母: <span style="font-size:14px;">import java.awt.Color; import java.awt.Font; impo

  • JS自定义对象实现Java中Map对象功能的方法

    本文实例讲述了JS自定义对象实现Java中Map对象功能的方法.分享给大家供大家参考.具体分析如下: Java中有集合,Map等对象存储工具类,这些对象使用简易,但是在JavaScript中,你只能使用Array对象. 这里我创建一个自定义对象,这个对象内包含一个数组来存储数据,数据对象是一个Key,可以实际存储的内容!   这里Key,你要使用String类型,和Java一样,你可以进行一些增加,删除,修改,获得的操作. 使用很简单,我先把工具类给大家看下: 复制代码 代码如下: /**  *

  • java实现的计算器功能示例【基于swing组件】

    本文实例讲述了java实现的计算器功能.分享给大家供大家参考,具体如下: package awtDemo; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.s

  • Java代码重用之功能与上下文重用

    我几乎不需要讨论为什么重用代码是有利的.代码重用通常使得程序开发更加快速,并使得 BUG 减少.一旦一段代码被封装和重用,那么只需要检查很少的一段代码即可确保程序的正确性.如果在整个应用程序中只需要在一个地方打开和关闭数据库连接,那么确保连接是否正常则容易的多.但我确信这些你已经都知道了. 有两种类型的重用代码,我称它们为重用类型: 功能重用(Action Reuse) 上下文重用(Context Reuse) 第一种类型是功能重用,这是最常见的一种重用类型.这也是大多数开发人员掌握的一种.即重

  • Java实现的日历功能完整示例

    本文实例讲述了Java实现的日历功能.分享给大家供大家参考,具体如下: 应用名称:Java日历 用到的知识:Java GUI编程,日期操作 开发环境:win8+eclipse+jdk1.8 功能说明:一个很简单的万年历,可以选择年份和月份,也可以用按钮翻页,日历会实时更新日期,最下方会显示当前操作系统的时间. 效果图: 源代码: CalendarFrame.java import java.awt.BorderLayout; import java.awt.GridLayout; import

随机推荐