ポストバーがさまざまなユーザーの投稿コンテンツをブロックしているのをよく見て、これを実装する方法について考えました。私は文字列を使用して、それを実装するために文字列を置き換えることを考えましたが、この効率は非常に低く、最長の一致を保証することはできません。これは当時の私の最初のアイデアです。私が最近取り組んだプロジェクトでは、いくつかのコンテンツをブロックする必要があり、この問題を再度分析し、最終的に次のコードを形成しました。
/ ***@説明:マスクされた単語関数実装*/パッケージCn.yicha.novel.search.util; java.io.bufferedreaderをインポートします。 java.io.fileをインポートします。 java.io.fileinputStreamをインポートします。 java.io.filenotfoundexceptionをインポートします。 java.io.ioexceptionをインポートします。 java.io.inputStreamReaderをインポートします。 java.util.hashsetをインポートします。 cn.yicha.novel.search.config.configをインポートします。 Public Class Forbidden {private static forbidden forbidden = new Forbidden(); //マスクワードハッシュセットプライベートハッシュセット<String> keyString = new Hashset <String>();プライベート最終static int maxlength = character.max_value; //マスクワード長ハッシュセット配列@suppresswarnings( "unchecked")private hashset <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:keylength [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; start = i; } else {i ++; }}}} if(start <str.length()){stringbuffer.append(str.substring(start)); } return stringbuffer.toString(); } /** * @param Path * @description:ロードマスキングワードを初期化 * @description:マスキング単語を保存するためのデータ形式ロジックは次のとおりです * @description:すべてのマスキング単語を保存するためのハッシュセット<文字列 * @description:ハッシュセット<integer> inted = intecrueのarved = balue * @description:edmax_balue ain ved a firt nected nected firt a descray:bed balue ned ford ford ford ford ford ford ford ford ford値、つまり、関連情報が配列に保存される位置 * @description:「hello」が「you」のint値を取得する場合、つまり、「hello」の関連情報は配列の位置に保存されます * @description:各ビットに保存されているマスクワードは、arrayに保存されています。 position*/ 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);文字列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()); keylength [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女優nihao")); int i = 'you'; System.out.println(i); }}上記は、Javaがブロッキングワード関数を実装する重要なコードです。みんなの学習に役立つことを願っています。