java实现屏蔽词功能

网友投稿 207 2023-07-23


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 keyString = new HashSet();

private final static int maxLength = Character.MAX_VALUE;

//屏蔽词长度HashSet数组

@SuppressWarnings("unchecked")

private HashSet[] keyLength = new HashSet[maxLength];

private Forbidden() {

loadhttp://Forbidden(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.shttp://ubstring(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用于存储所有的屏蔽词

* @Description: 构建长度为maxLength = Character.MAX_VALUE 的 HashSet数组

* @Description: 将加载的屏蔽中第一个字符转化成int值,即相关信息存储在数组中的位置,

* @Description: 如“你好呀”得到'你'的int值为20320,即“你好呀”相关信息存储在数组的第20320位置

* @Description: 数组每一位存储的HashSet结构存储在该位置的屏蔽词的长度

*/

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 a = new HashSet();

a.add(s.length());

keyLength[i] = a;

} else {

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 多线程synchronized关键字详解(六)
下一篇:java实现mongodb的数据库连接池
相关文章

 发表评论

暂时没有评论,来抢沙发吧~