资源简介
高效敏感词过滤JAVA实现(DFA算法) 5000字2ms
节点 + 2进制标识(节省空间/提高查询效率)
附源码、注释,附带专业敏感词库(3396个敏感词)
看得上就拿去用,替换下一两处util方法、改个路径即可
不求什么,用得好的话,记得有那么一个人提供就够了。
如遇问题,欢迎交流。 QQ 463550192
普通PC测试结果: 2015-5-1
加载时间 : 41542826ns
加载时间 : 41ms
解析字数 : 5000
解析时间 : 2295131ns
解析时间 : 2ms
代码片段和文件信息
package com.towell.carman.common.sensitive;
/**
* 功不唐捐
* @author 庞健松 ~ 2014年11月6日 下午6:13:37
*/
public class FilterSet{
private final long[] elements;
public FilterSet() {
elements = new long[1 + (65535 >>> 6)];
}
public void add(final int no) {
elements[no >>> 6] |= (1L << (no & 63));
}
public void add(final int... no) {
for(int currNo : no)
elements[currNo >>> 6] |= (1L << (currNo & 63));
}
public void remove(final int no) {
elements[no >>> 6] &= ~(1L << (no & 63));
}
/**
*
* @param no
* @return true:添加成功 false:原已包含
*/
public boolean addAndNotify(final int no) {
int eWordNum = no >>> 6;
long oldElements = elements[eWordNum];
elements[eWordNum] |= (1L << (no & 63));
boolean result = elements[eWordNum] != oldElements;
// if (result)
// size++;
return result;
}
/**
*
* @param no
* @return true:移除成功 false:原本就不包含
*/
public boolean removeAndNotify(final int no) {
int eWordNum = no >>> 6;
long oldElements = elements[eWordNum];
elements[eWordNum] &= ~(1L << (no & 63));
boolean result = elements[eWordNum] != oldElements;
// if (result)
// size--;
return result;
}
public boolean contains(final int no) {
return (elements[no >>> 6] & (1L << (no & 63))) != 0;
}
public boolean containsAll(final int... no) {
if(no.length==0)
return true;
for(int currNo : no)
if((elements[currNo >>> 6] & (1L << (currNo & 63))) == 0)
return false;
return true;
}
/**
* 不如直接循环调用contains
* @param no
* @return
*/
public boolean containsAll_ueslessWay(final int... no) {
long[] elements = new long[this.elements.length];
for(int currNo : no){
elements[currNo >>> 6] |= (1L << (currNo & 63));
}//这一步执行完跟循环调用contains差不多了
for (int i = 0; i < elements.length; i++)
if ((elements[i] & ~this.elements[i]) != 0)
return false;
return true;
}
/**
* 目前没有去维护size,每次都是去计算size
* @return
*/
public int size() {
int size = 0;
for (long element : elements)
size += Long.bitCount(element);
return size;
}
public static void main(String[] args) {
FilterSet oi = new FilterSet();
System.out.println(oi.elements.length);
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 539 2015-05-01 21:44 readme.txt
目录 0 2015-05-01 20:59 sensitive\
文件 2420 2015-04-30 20:05 sensitive\FilterSet.java
文件 16562 2015-05-01 21:06 sensitive\WordFilter.java
文件 1628 2015-05-01 19:27 sensitive\WordNode.java
文件 41791 2015-05-28 21:19 word.txt
评论
共有 条评论