ספירת מילים במחרוזת עם Java

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

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

2. שימוש StringTokenizer

דרך פשוטה לספור מילים במחרוזת ב- Java זה להשתמש ב- StringTokenizer מעמד:

assertEquals (3, StringTokenizer חדש ("שלושה עכברים עיוורים"). countTokens ()); assertEquals (4, StringTokenizer חדש ("ראה \ thow \ tthey \ trun"). countTokens ());

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

אבל זה עשוי להשתבש במקומות מסוימים, כמו מקפים:

assertEquals (7, StringTokenizer חדש ("אשתו של האיכר - היא הייתה מאלבוקרקי"). countTokens ());

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

לְמַרְבֶּה הַמַזָל, StringTokenizer נשלח עם קונסטרוקטור אחר. אנחנו יכולים לעבור תוחם אל הקונסטרוקטור לבצע את העבודה לעיל:

assertEquals (7, StringTokenizer חדש ("אשתו של האיכר - היא הייתה מאלבוקרקי", "-"). countTokens ());

זה שימושי כשמנסים לספור את המילים במחרוזת מ- משהו כמו קובץ CSV:

assertEquals (10, StringTokenizer חדש ("עשית, אי פעם, ראית, כזה, מראה, ב, החיים שלך", ",") countTokens ());

כך, StringTokenizer הוא פשוט וזה גורם לנו לרוב הדרך לשם.

בוא נראה אם ​​כן איזה ביטויים רגילים בכוחות סוס יכולים לתת לנו.

3. ביטויים רגילים

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

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

assertEquals (7, countWordsUsingRegex ("אשת החקלאי - היא הייתה מאלבוקרקי"));

בואו ונמלא את העניינים קצת כדי לראות את הכוח של regex:

assertEquals (9, countWordsUsingRegex ("אף אחד לא צריך% לכתוב אי פעם, זה; אבל: טוב"));

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

מתברר שאנחנו באמת לא צריכים לעשות הרבה, עוברים את ה- regex[\ pP \ s && [^ ']] +אל הלְפַצֵלשיטת ה-חוּטהכיתה תעשה את הטריק:

מספר ציבורי סטטי ציבוריWordsUsingRegex (מחרוזת arg) {if (arg == null) {return 0; } מחרוזת סופית [] מילים = arg.split ("[\ pP \ s && [^ ']] +"); מילים להחזיר.אורך; }

הרגקס [\ pP \ s && [^ ']] + מוצא כל אורך של סימני פיסוק או רווחים ומתעלם מסימן הפיסוק של האפרופרוף.

למידע נוסף על ביטויים רגולריים, עיין בביטויים רגולריים בבלדונג.

4. לולאות וה חוּט ממשק API

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

הצבנו את הדגל ל מִלָה כשנתקלים במילה חדשה ומגדילים את ספירת המילים ואז חוזרים אל מפריד כשאנחנו נתקלים במילה שאינה (פיסוק או תווי רווח).

גישה זו נותנת לנו את אותן התוצאות שקיבלנו בביטויים קבועים:

assertEquals (9, countWordsManually ("אף אחד ואחד לא צריך% לכתוב אי פעם, זה אבל טוב")); 

עלינו להיזהר במקרים מיוחדים בהם סימני פיסוק אינם ממש מפרידים בין מילים, לדוגמה:

assertEquals (6, countWordsManually ("אשתו של האיכר - היא הייתה מאלבוקרקי"));

מה שאנחנו רוצים כאן זה לספור את "החקלאי" כמילה אחת, למרות שהאפרופרוף "'" הוא סימן פיסוק.

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

פרטית בוליאנית סטטית isAllowedInWord (char charAt) 

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

כעת אנו יכולים להשתמש בשיטה זו ביישום שלנו:

מספר ציבורי סטטי ציבוריWordsManually (String arg) {if (arg == null) {return 0; } int flag = SEPARATOR; ספירת int = 0; int stringLength = arg.length (); int characterCounter = 0; בעוד (characterCounter <stringLength) {if (isAllowedInWord (arg.charAt (characterCounter)) && flag == SEPARATOR) {flag = WORD; ספירת ++; } אחרת אם (! isAllowedInWord (arg.charAt (characterCounter))) {flag = SEPARATOR; } characterCounter ++; } ספירת החזרות; }

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

5. מסקנה

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

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


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