这期内容当中小编将会给大家带来有关如何在Java项目中利用DFA算法实现一个过滤敏感字功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
模式图
直接上代码
public class KeywordFilter {// private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public static Map<String, HashMap> currentMap = new ConcurrentHashMap<String, HashMap>(); public static Map nowhash = null; public static Object wordMap;// map子节点 // 不建立对象 private KeywordFilter() { } private static String getKey(int companyId) { return "companyId" + companyId; } public static void clear() { try { currentMap.clear(); } catch (Exception e) { e.printStackTrace(); } finally { } } public static void saveKeywords(int companyId, List<String> keywords) { try { Map tempAllMap = currentMap; String key = getKey(companyId); int l = keywords.size(); int il; Map tempMap; for (int i = 0; i < l; i++) { String key2 = keywords.get(i).trim();// 去掉空白 nowhash = currentMap; il = key2.length(); for (int j = 0; j < il; j++) { char word = key2.charAt(j); tempMap = (Map) nowhash.get(word); wordMap = nowhash.get(word); if (wordMap != null) {// 检查数据 if (!tempMap.containsKey(key)) { nowhash.put(key, 0); } nowhash = (HashMap) wordMap; } else { HashMap<String, String> newWordHash = new HashMap<String, String>(); newWordHash.put(key, "0"); nowhash.put(word, newWordHash); nowhash = newWordHash; } if (j == il - 1) { nowhash.put(key, "1"); } } } } catch (Exception e) { e.printStackTrace(); } finally { nowhash = null; wordMap = null; } } public static List<String> repword(int companyId, String txt) { Map tempMap = currentMap; List<String> result = new ArrayList<String>(); String key = getKey(companyId); nowhash = currentMap; int l = txt.length(); char word; String keywordStr = ""; String keyStatu; StringBuilder keyword = new StringBuilder();// 敏感字 for (int i = 0; i < l; i++) { word = txt.charAt(i); wordMap = nowhash.get(word); if (wordMap != null) {// 找到类似敏感字的字体,开始查询 keyword.append(word); Object te = nowhash = (HashMap) wordMap; // 遍历到这一步,就符合完整的关键字模板 if (nowhash.get(key) != null && nowhash.get(key).toString().equals("1")) {// 确定是敏感字,开始替换 if (i < l - 1 && nowhash.get(txt.charAt(i + 1)) != null) {// 优先过滤长敏感词,去掉就槟城了优先过滤段敏感词 continue; } txt = txt.replaceAll(keyword.toString(), "*"); nowhash = currentMap; keywordStr += keyword.toString() + ","; i = i - keyword.length() + 1; l = txt.length();// 重新获取字符长度 keyword.delete(0, keyword.length());// 清空数据 } } else {// 这个字不是敏感字,直接排除 nowhash = currentMap; keyword.delete(0, keyword.length());// 清空数据 continue; } } // 清除内存指向 nowhash = null; wordMap = null; result.add(txt); result.add(keywordStr.length() - 1 > 0 ? keywordStr.substring(0, keywordStr.length() - 1) : keywordStr); return result; } private static int checkKeyWords(String txt, int companyId, int begin) { int result = 0; String key = getKey(companyId); try { nowhash = currentMap; int l = txt.length(); char word = 0; for (int i = begin; i < l; i++) { word = txt.charAt(i); wordMap = nowhash.get(word); if (wordMap != null) { result++; nowhash = (HashMap) wordMap; if (((String) nowhash.get(key)).equals("1")) { nowhash = null; wordMap = null; return result; } } else { result = 0; break; } } } catch (Exception e) { e.printStackTrace(); } finally { nowhash = null; wordMap = null; return result; } } public static String getTxtKeyWords(String txt, int companyId) { String result = null; StringBuilder temp = new StringBuilder(); String key; int l = txt.length(); for (int i = 0; i < l;) { int len = checkKeyWords(txt, companyId, i); if (len > 0) { key = (txt.substring(i, i + len));// 挑选出来的关键字 temp.append(key + ","); txt = txt.replaceAll(key, "");// 挑选出来的关键字替换成空白,加快挑选速度 l = txt.length(); } else { i++; } } if (temp.length() > 0) { result = temp.substring(0, temp.length() - 1); } return result; } public boolean isKeyWords(String txt, int companyId) { for (int i = 0; i < txt.length(); i++) { int len = checkKeyWords(txt, companyId, i); if (len > 0) { return true; } } return false; } public static void main(String[] arg) { List<String> keywords = new ArrayList<String>(); keywords.add("傻×"); keywords.add("汉*"); keywords.add("草"); keywords.add("草泥马"); KeywordFilter.saveKeywords(1, keywords); String txt = "是傻×汉*傻A傻B傻C傻D汉*傻×草泥马"; List<String> list = repword(1, txt); System.out.println("文中包含的敏感字为:" + list.get(1)); System.out.println("原文:" + txt); System.out.println("敏感字过滤后:" + list.get(0)); }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- 如何在 Java 中实现踢人下线功能?(Java怎么实现踢人下线功能)
- Java 交换器(exchanger)的替代方案都有哪些呢?(java exchanger的替代方案有哪些)
- Java 中如何使用 JsonNode 来解析 JSON 数据?(Java JsonNode如何解析JSON数据)
- 如何进行Ruby代码安全检测
- 在 Java 中如何设置 Swing 的背景图片?(java中swing如何设置背景图片)
- Java 输入输出流出现问题该如何解决?(Java输入输出流出现问题怎么解决)
- Java 验证码的存储方式都有哪些呢?(Java验证码的存储方式有哪些)
- 在 Java 集合框架中,Arrays 类究竟有着怎样的地位?(Arrays类在Java集合框架中的地位)
- Java 调用 WebService 服务的详细步骤有哪些?(java调用WebService服务的步骤是什么)
- Java中MVC设计模式的特点有哪些?(java中mvc设计模式有哪些特点)
猜你喜欢
AI推送时光机如何在Java项目中利用DFA算法实现一个过滤敏感字功能
后端开发2023-05-31
如何在java中使用DFA算法过滤敏感词
后端开发2023-05-31
如何在java项目中利用ocr实现一个图片文字识别功能
后端开发2023-05-31
如何在java项目中实现一个递归调用功能
后端开发2023-06-06
如何在Java项目中利用余弦方法实现一个相似度计算算法
后端开发2023-05-31
如何在Java项目中利用FasfDFS实现一个文件上传下载功能
后端开发2023-05-31
如何在Java项目中利用字符流实现一个io编程
后端开发2023-05-31
如何在Android sdutio项目中利用Zxing实现一个扫码功能
后端开发2023-05-31
如何在Java项目中实现一个时间轮算法
后端开发2023-05-31
如何在java项目中实现一个ECC加密算法
后端开发2023-05-31
如何在Java项目中实现一个DES加密算法
后端开发2023-05-31
在Java项目中使用字节流如何实现一个文件复制功能
后端开发2023-05-31
如何在JAVA项目中利用FTPClient工具类实现一个上传下载功能
后端开发2023-05-31
如何在PHP项目中利用Laravel实现一个文件下载功能
后端开发2023-05-31
如何在Java项目中实现一个快速查找算法
后端开发2023-05-31
如何在java项目中实现一个插入排序算法
后端开发2023-05-31
怎么在Java项目中利用rabbitMQ实现一个消息收发功能
后端开发2023-05-31
怎么在Java项目中利用QuickSort实现一个快速排序功能
后端开发2023-05-31
在Java项目中使用WebUploader如何实现一个文件上传功能
后端开发2023-05-31
在java项目中使用Demo如何实现一个文件上传功能
后端开发2023-05-31
咦!没有更多了?去看看其它编程学习网 内容吧