ฉันมักจะเห็นโพสต์แถบปิดกั้นเนื้อหาของผู้ใช้ที่หลากหลายและฉันคิดเกี่ยวกับวิธีการใช้งานนี้ ฉันคิดเกี่ยวกับการใช้สตริงเพื่อเปลี่ยนไปใช้ แต่ประสิทธิภาพนี้ต่ำมากและไม่สามารถรับประกันการจับคู่ที่ยาวที่สุดได้ นี่คือความคิดเริ่มต้นของฉันในเวลานั้น ในโครงการที่ฉันเพิ่งทำงานเมื่อเร็ว ๆ นี้ฉันต้องบล็อกเนื้อหาบางส่วนและฉันวิเคราะห์ปัญหานี้อีกครั้งและในที่สุดก็สร้างรหัสต่อไปนี้
/ ***@คำอธิบาย: การใช้งานฟังก์ชันคำสวมหน้ากาก*/ แพ็คเกจ 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; คลาสสาธารณะที่ต้องห้าม {ส่วนตัวคงที่ห้ามห้าม = new Forbidden (); // หน้ากาก Word HashSet HashSet ส่วนตัว <String> keystring = new HashSet <String> (); maxlength int สุดท้ายส่วนตัวสุดท้าย = character.max_value; // หน้ากากความยาวคำ Hashset array @suppresswarnings ("ไม่ได้ตรวจสอบ") แฮชเซ็ตส่วนตัว <integer> [] keyLength = new hashset [maxlength]; private forbidden () {loadforbidden (config.getClassRoot () + "forbidden.txt"); } สาธารณะคงที่ห้ามมิให้ getForBidden () {ส่งคืนต้องห้าม; } / ** * @param str * @return * @description: สตริงอินพุตถูกปกปิดเพื่อให้ได้การจับคู่ความยาวสูงสุด * / การอ่านสตริงสาธารณะ (สตริง str) {ถ้า (str == null) {return null; } StringBuffer StringBuffer = new StringBuffer (); int start = 0; สำหรับ (int i = 0; i <str.length ();) {int at = str.charat (i); if (keyLength [at] == null) {i ++; ดำเนินการต่อ; } else {int ml = 0; สำหรับ (Object obj: keylength [ที่] .toarray ()) {int len = ((จำนวนเต็ม) obj) .intvalue (); if (i + len <= str.length ()) {string s = str.substring (i, i + len); if (keystring.contains) {// // ความยาวสูงสุดที่ตรงกัน ml = len> ml? Len: ML; }}} if (ml> 0) {stringbuffer.append (str.substring (เริ่มต้น, i)). ผนวก ("***"); i += ml; เริ่ม = i; } else {i ++; }}}} if (start <str.length ()) {stringbuffer.append (str.substring (เริ่มต้น)); } return stringbuffer.toString (); } /** * @param path * @description: เริ่มต้นการโหลดคำที่ปิดบังคำ * @description: ลอจิกรูปแบบข้อมูลสำหรับการจัดเก็บคำที่ปิดบังมีดังนี้ * @description: สร้าง hashset <string> เพื่อเก็บคำที่ปิดการใช้งานทั้งหมด * @description ค่านั่นคือตำแหน่งที่เก็บข้อมูลที่เกี่ยวข้องไว้ในอาร์เรย์* @description: ถ้า "สวัสดี" ได้รับค่า int ของ 'คุณ' คือ 20320 นั่นคือข้อมูลที่เกี่ยวข้องของ "สวัสดี" จะถูกเก็บไว้ในตำแหน่ง 20320 ของอาร์เรย์* @description โมฆะสาธารณะ loadforbidden (พา ธ สตริง) {ไฟล์ forbiddenfile = ไฟล์ใหม่ (พา ธ ); FileInputStream FileInputStream; ลอง {fileInputStream = new FileInputStream (ForBiddenFile); inputStreamReader inputStreamReader = ใหม่ inputStreamReader (fileInputStream, "UTF-8"); bufferedReader bufferedReader = ใหม่ bufferedReader (inputStreamReader); สตริง s; ในขณะที่ ((s = bufferedreader.readline ())! = null) {s = s.trim (); if (s.length ()> 0) {keystring.add (s); int i = s.charat (0); if (keylength [i] == null) {// หน้ากากความยาวคำแฮชเซ็ตแฮชเซ็ต <teeger> 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 (); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// system.out.println (forbidden.getForBidden (). อ่าน ("Av Actress nihao"))); int i = 'คุณ'; System.out.println (i); -ด้านบนเป็นรหัสคีย์สำหรับ Java ในการใช้ฟังก์ชันการปิดกั้น Word ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน