나는 종종 Post Bar가 다양한 사용자의 게시 컨텐츠를 차단하는 것을보고,이를 구현하는 방법에 대해 생각했습니다. 나는 문자열을 사용하여 교체하여 구현하는 것에 대해 생각했지만이 효율성은 매우 낮으며 가장 긴 일치를 보장 할 수는 없습니다. 이것은 당시의 나의 초기 아이디어입니다. 최근에 작업 한 프로젝트에서 일부 콘텐츠를 차단해야 했고이 문제를 다시 분석하고 마지막으로 다음 코드를 구성했습니다.
/ ***@description : 마스크 된 단어 함수 구현*/ 패키지 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; java.util.hashset 가져 오기; cn.yicha.novel.search.config.config import; 공개 클래스 금지 된 {private static forbidden forbidden = new forbidden (); // 마스크 워드 해시 세트 개인 해시 세트 <string> 키스트 링 = new Hashset <문자열> (); 개인 최종 정적 int maxlength = 문자 .max_value; // 마스크 단어 길이 해시 세트 배열 @SuppressWarnings ( "선택 취소") 개인 해시 세트 <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 ++; 계속하다; } else {int ml = 0; for (object obj : kyylength [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? 렌 : ML; }}} if (ml> 0) {StringBuffer.append (str.substring (start, i)). Append ( "***"); i += ml; 시작 = i; } else {i ++; }}}} if (start <str.length ()) {StringBuffer.append (str.substring (start)); } return StringBuffer.toString (); } /** * @param path * @description : 마스킹 단어로드 초기화 * @description : 마스킹 단어를 저장하기위한 데이터 형식 로직은 다음과 같습니다. * @description : 모든 마스킹 단어를 구축하려면 모든 마스킹 단어를 저장하십시오 * @description : 길이의 <teger> 배열 길이를 가진 <teger> 배열을 구축하십시오. 즉, 관련 정보가 배열에 저장되는 위치,* @description : "hello"가 'you'의 int 값을 가져 오면 "hello"의 관련 정보는 배열의 20320 위치에 저장됩니다.* @description : 배열의 각 비트에 저장된 마스크의 길이는 해당의 위치에 저장되어 있습니다. loadForBidden (문자열 경로) {file forbiddenFile = 새 파일 (Path); fileInputStream fileInputStream; try {fileInputStream = new FileInputStream (forbiddenFile); inputStreamReader inputStreamReader = new inputStreamReader (FileInputStream, "UTF-8"); bufferedReader bufferedReader = new bufferedReader (inputStreamReader); 문자열 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) {// 마스크 단어 길이 해시 세트 해시 세트 <integer> a = new Hashset <integer> (); A.add (s.length ()); 키 길이 [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 Actress Nihao")); int i = '당신'; System.out.println (i); }}위는 Java가 차단 단어 함수를 구현할 수있는 키 코드입니다. 모든 사람의 학습에 도움이되기를 바랍니다.