• 大小: 23KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: Java
  • 标签: DFA算法  

资源简介

高效敏感词过滤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

评论

共有 条评论