בדוק אם מחרוזת מכילה מילות מפתח מרובות ב- Java

1. מבוא

במדריך המהיר הזה, נגלה כיצד לזהות מספר מילים בתוך מחרוזת.

2. הדוגמה שלנו

נניח שיש לנו את המחרוזת:

מחרוזת inputString = "שלום לך, באלדונג";

המשימה שלנו היא למצוא אם ה- inputString מכיל את "שלום" ו "באלדונג" מילים.

אז בואו נכניס את מילות המפתח שלנו למערך:

מחרוזת [] מילים = {"שלום", "באלדונג"};

יתר על כן, סדר המילים אינו חשוב, וההתאמות צריכות להיות תלויות רישיות.

3. שימוש String.contains ()

בתור התחלה, נראה כיצד להשתמש ב- String.contains () שיטה להשגת מטרתנו.

בואו נעבור על מערך מילות המפתח ונבדוק את המופע של כל פריט בתוך ה- inputString:

בוליאני סטטי ציבורי מכיל ווערטער (מחרוזת inputString, מחרוזת [] פריטים) {בוליאני נמצא = true; עבור (פריט מחרוזת: פריטים) {if (! inputString.contains (item)) {נמצא = שקר; לשבור; }} החזר נמצא; }

ה מכיל () השיטה תחזור נָכוֹן אם ה inputString מכיל את הנתון פריט. כשאין אף אחת ממילות המפתח במחרוזת שלנו, אנו יכולים להפסיק להתקדם ולהחזיר מיד שֶׁקֶר.

למרות העובדה שאנחנו צריכים לכתוב קוד נוסף, פיתרון זה מהיר למקרי שימוש פשוטים.

4. שימוש String.indexOf ()

דומה לפיתרון המשתמש ב- String.contains () שיטה, אנו יכולים לבדוק את מדדי מילות המפתח באמצעות String.indexOf () שיטה. לשם כך, אנו זקוקים לשיטה המקבלת את inputString ורשימת מילות המפתח:

בוליאני סטטי ציבורי מכיל AdWordsIndexOf (מחרוזת inputString, מחרוזת [] מילים) {בוליאני נמצא = true; עבור (מילה מחרוזת: מילים) {אם (inputString.indexOf (מילה) == -1) {נמצא = שקר; לשבור; }} החזרה נמצאה; }

ה אינדקס של() השיטה מחזירה את אינדקס המילה בתוך ה- inputString. כשאין לנו את המילה בטקסט, האינדקס יהיה -1.

5. שימוש בביטויים רגולריים

עכשיו, בואו נשתמש בביטוי קבוע כדי להתאים למילים שלנו. לשם כך נשתמש ב- תבנית מעמד.

ראשית, בואו נגדיר את ביטוי המחרוזת. מאחר שעלינו להתאים שתי מילות מפתח, נבנה את כלל ה- regex שלנו עם שתי ראשי מראה:

תבנית תבנית = תבנית. קומפילציה ("(? =. * שלום) (? =. * באלדונג)");

ולמקרה הכללי:

StringBuilder regexp = StringBuilder חדש (); עבור (מילת מחרוזת: מילים) {regexp.append ("(? =. *"). append (word) .append (")"); }

לאחר מכן, נשתמש ב- שידוך () שיטה ל למצוא() ההתרחשויות:

בוליאני סטטי ציבורי מכיל AdWordsPatternMatch (String inputString, String [] מילים) {StringBuilder regexp = StringBuilder חדש (); עבור (מילת מחרוזת: מילים) {regexp.append ("(? =. *"). append (word) .append (")"); } תבנית תבנית = תבנית. קומפילציה (regexp.toString ()); דפוס החזרה.matcher (inputString) .find (); }

אבל, לביטויים רגולריים יש עלות ביצוע. אם יש לנו מספר מילים לחפש, ייתכן שהביצועים של פתרון זה לא יהיו מיטביים.

6. שימוש ב- Java 8 ו- רשימה

ולסיום, אנו יכולים להשתמש ב- API של Stream של ג'אווה 8. אבל ראשית, בואו נעשה שינויים קלים עם הנתונים הראשוניים שלנו:

רשימה inputString = Arrays.asList (inputString.split ("")); רשימת מילים = Arrays.asList (מילים);

עכשיו הגיע הזמן להשתמש ב- API של Stream:

בוליאני סטטי ציבורי מכיל AdWordsJava8 (מחרוזת inputString, מחרוזת [] מילים) {List inputStringList = Arrays.asList (inputString.split ("")); רשימת wordsList = Arrays.asList (מילים); להחזיר את המילים List.stream (). allMatch (inputStringList :: מכיל); }

צינור הפעולה שלמעלה יחזור נָכוֹן אם מחרוזת הקלט מכילה את כל מילות המפתח שלנו.

לחלופין, אנחנו יכולים פשוט להשתמש ב- מכיל את כל () שיטת מסגרת האוספים כדי להשיג את התוצאה הרצויה:

בוליאני סטטי ציבורי מכיל AdWordsArray (מחרוזת inputString, מחרוזת [] מילים) {List inputStringList = Arrays.asList (inputString.split ("")); רשימת wordsList = Arrays.asList (מילים); להחזיר inputStringList.containsAll (רשימת המילים); }

עם זאת, שיטה זו פועלת למילים שלמות בלבד. לכן, הוא ימצא את מילות המפתח שלנו רק אם הן מופרדות עם רווח לבן בתוך הטקסט.

7. שימוש ב- אהו-קוראסיק אַלגוֹרִיתְם

במילים פשוטות, ה אהו-קוראסיק האלגוריתם מיועד לחיפוש טקסט עם מספר מילות מפתח. יש לזה עַל) מורכבות זמן לא משנה כמה מילות מפתח אנו מחפשים או כמה אורך הטקסט.

בואו נכלול את תלות האלגוריתם Aho-Corasick בתוכנו pom.xml:

 org.ahocorasick ahocorasick 0.4.0 

ראשית, בואו נבנה את צינור הטרי עם ה- מילים מערך מילות מפתח. לשם כך נשתמש במבנה הנתונים של Trie:

Trie trie = Trie.builder (). OnlyWholewords (). להוסיף מילות מפתח (מילים) .build ();

לאחר מכן, בואו נקרא לשיטת המנתח עם ה- inputString טקסט בו נרצה למצוא את מילות המפתח ולשמור את התוצאות ב- פולט אוסף:

אוסף פולט = trie.parseText (inputString);

ולסיום, אם נדפיס את התוצאות שלנו:

emits.forEach (System.out :: println);

עבור כל מילת מפתח נראה את מיקום ההתחלה של מילת המפתח בטקסט, את מיקום הסיום ומילת המפתח עצמה:

0: 4 = שלום 13: 20 = באלדונג

לבסוף, בואו נראה את היישום המלא:

בוליאני סטטי ציבורי מכיל AdWordsAhoCorasick (מחרוזת inputString, מחרוזת [] מילים) {Trie trie = Trie.builder (). onlyWholeWords (). addKeywords (מילים). אוסף פולט = trie.parseText (inputString); emits.forEach (System.out :: println); בוליאני נמצא = נכון; עבור (מילת מחרוזת: מילים) {בוליאני מכיל = Arrays.toString (emits.toArray ()). מכיל (מילה); אם (! מכיל) {נמצא = שקר; לשבור; }} החזרה נמצאה; }

בדוגמה זו אנו מחפשים מילים שלמות בלבד. לכן, אם אנו רוצים להתאים לא רק את inputString אבל "שלום באלדונג" כמו כן, עלינו פשוט להסיר את רק מילים שלמות () תכונה מה טרי צינור בונה.

בנוסף, זכור כי אנו מסירים גם את האלמנטים הכפולים מה- פולט אוסף, שכן יתכן שיש התאמות מרובות עבור אותה מילת מפתח.

8. מסקנה

במאמר זה למדנו כיצד למצוא מספר מילות מפתח בתוך מחרוזת. יתר על כך, הראינו דוגמאות באמצעות הליבה JDK, כמו גם עם אהו-קוראסיק סִפְרִיָה.

כרגיל, הקוד השלם למאמר זה זמין באתר GitHub.