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

1. סקירה כללית

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

2. String.indexOf

בואו ננסה תחילה להשתמש ב- String.indexOf שיטה. אינדקס של נותן לנו את המיקום הראשון שבו נמצא המצע, או -1 אם הוא בכלל לא נמצא.

כאשר אנו מחפשים "ראפ", הוא יחזור 9:

Assert.assertEquals (9, "רפסודיאן בוהמי" .indexOf ("ראפ"));

כשאנחנו מחפשים "ראפ", הוא יחזיר -1 מכיוון שהוא תלוי רישיות.

Assert.assertEquals (-1, "רפסודיאן בוהמי" .indexOf ("ראפ")); Assert.assertEquals (9, "Rhapsodyan Bohemian" .toLowerCase (). IndexOf ("rhap"));

חשוב גם לציין שאם נחפש ב- סובסטרינג "An", הוא יחזיר 6 מכיוון שהוא מחזיר את ההתרחשות הראשונה:

Assert.assertEquals (6, "Rhapsodyan Bohemian" .indexOf ("an"));

3. מחרוזת.מכילה

הבא, בואו ננסה מחרוזת.מכילה. מכיל יחפש תשתית לאורך כל התרחישים חוּט ויחזור נָכוֹן אם הוא נמצא ו שֶׁקֶר אחרת.

בדוגמה זו, מכיל החזרות נָכוֹן כי "היי" נמצא.

Assert.assertTrue ("היי הו, בוא נלך". מכיל ("היי"));

אם המחרוזת לא נמצאה, מכיל החזרות שֶׁקֶר:

Assert.assertFalse ("היי הו, בוא נלך". מכיל ("ג'יי"));

בדוגמה האחרונה, "היי" לא נמצא בגלל מחרוזת.מכילה הוא תלוי רישיות.

Assert.assertFalse ("היי הו, בוא נלך". מכיל ("היי")); Assert.assertTrue ("היי הו, בוא נלך". ToLowerCase (). מכיל ("היי"));

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

4. StringUtils.containsIgnoreCase

הגישה השלישית שלנו תשתמש StringUtils #containIgnoreCase מספריית Apache Commons Lang:

Assert.assertTrue (StringUtils.containsIgnoreCase ("רכבת בורחת", "רכבת")); Assert.assertTrue (StringUtils.containsIgnoreCase ("רכבת בורחת", "רכבת"));

אנחנו יכולים לראות את זה יבדוק אם א סובסטרינג כלול א חוּט, מתעלם מהמקרה. בגלל זה containIgnoreCase החזרות נָכוֹן כאשר אנו מחפשים "טריי" וגם "טריי" בתוך "רכבת בורח".

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

5. שימוש תבנית

הגישה האחרונה שלנו תהיה שימוש ב- תבנית עם ביטוי קבוע:

תבנית תבנית = תבנית.קומפילציה ("(?

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

Matcher matcher = pattern.matcher ("היכה בדרך ג'ק"); Assert.assertTrue (matcher.find ());

לדוגמא, הפעם הראשונה בה למצוא מבוצע, הוא חוזר נָכוֹן מכיוון שהמילה "דרך" כלולה בתוך המחרוזת "היכה בדרך ג'ק", אך כאשר אנו מנסים למצוא את אותה מילה במחרוזת "ואל תחזור לא יותר" היא חוזרת שֶׁקֶר:

Matcher matcher = pattern.matcher ("ואל תחזור לא יותר"); Assert.assertFalse (matcher.find ());

6. השוואת ביצועים

נשתמש במסגרת קוד פתוח של מיקרו-benchmark בשם רתמת Java Microbenchmark (JMH) על מנת להחליט איזו שיטה היא היעילה ביותר מבחינת זמן הביצוע.

6.1. הגדרת מידוד

כמו בכל אמת מידה של JMH, יש לנו את היכולת לכתוב להכין שיטה, על מנת שיהיו דברים מסוימים לפני הפעלת המדדים שלנו:

@ הגדרת הגדרת הריק הציבורי () {message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit," + "sed do eiusmod temporid incididunt to labore et dolore magna aliqua." + "ללא שם: מינימום ויאם, תרגיל נוסטרוד נוזלי. "+" nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in "+" reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. "+" Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt "+" mollit anim id est laborum "; דפוס = דפוס.קומפילציה ("(?

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

אנחנו גם מתחילים לאתחל תבנית על מנת להשתמש בה מאוחר יותר באחד המדדים שלנו.

6.2. ה String.indexOf אמת מידה

המדד הראשון שלנו ישתמש אינדקס של:

@Benchmark public int indexOf () {return message.indexOf ("eiusmod"); }

אנו נחפש באיזו עמדה "eiusmod" קיים הוֹדָעָה מִשְׁתַנֶה.

6.3. ה מחרוזת.מכילה אמת מידה

המדד השני שלנו ישתמש מכיל:

@Benchmark הציבורי בוליאני מכיל () {return message.contains ("eiusmod"); }

ננסה למצוא אם ה- הוֹדָעָה ערך מכיל "Eiusmod", אותו דבר סובסטרינג נעשה שימוש במידון הקודם.

6.4. ה StringUtils.containsIgnoreCase אמת מידה

המדד השלישי שלנו ישתמש StringUtils #containIgnoreCase:

@Benchmark הציבורי הבוליאני containStringUtilsIgnoreCase () {להחזיר StringUtils.containsIgnoreCase (הודעה, "eiusmod"); }

כמו בדוחות המידה הקודמים, אנו נחפש ב- סובסטרינג בתוך ה הוֹדָעָה ערך.

6.5. ה תבנית אמת מידה

והמדד האחרון שלנו ישתמש תבנית:

@Benchmark חיפוש בוליאני ציבוריWithPattern () {return pattern.matcher (message) .find (); }

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

6.6. ניתוח תוצאות מידוד

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

לאחר ביצוע בדיקת JMH שלנו, אנו יכולים לראות את הזמן הממוצע שלכל אחד מהם לקח:

  • מכיל: 14.736 ns
  • אינדקס של: 14.200 ns
  • containStringUtilsIgnoreCase: 385.632 ns
  • searchWithPattern: 1014.633 ns

אינדקס של השיטה היא היעילה ביותר, ואחריה צמודה מכיל. זה הגיוני ש מכיל לקח יותר זמן כי הוא משתמש אינדקס של כְּלַפֵּי פְּנִים.

containStringUtilsIgnoreCase לקח תוספת זמן בהשוואה לקודמים מכיוון שזה לא רגיש במקרה.

searchWithPattern, לקח זמן ממוצע גבוה עוד יותר האחרון, להוכיח כי באמצעות תבניתs היא החלופה הגרועה ביותר למשימה זו.

7. מסקנה

במאמר זה בדקנו דרכים שונות לחיפוש תשתית ב- חוּט. שיווינו גם את ביצועי הפתרונות השונים.

כמו תמיד, הקוד זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found