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

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

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

2. פנגרמות

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

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

3. שימוש ב- ל לוּלָאָה

ראשית, בואו ננסה א ל לוּלָאָה. נאכלס א בוליאני מערך עם סמנים לכל תו של האלף בית.

הקוד חוזר נָכוֹן כאשר כל הערכים במערך הסמנים מוגדרים ל נָכוֹן:

ציבורי בוליאני סטטי ציבורי isPangram (String str) {if (str == null) {return false; } בוליאני [] alphabetMarker = בוליאני חדש [ALPHABET_COUNT]; Arrays.fill (AlfabetMarker, שקר); int alphabetIndex = 0; str = str.toUpperCase (); עבור (int i = 0; i <str.length (); i ++) {if ('A' <= str.charAt (i) && str.charAt (i) <= 'Z') {alphabetIndex = str.charAt (ט) - 'א'; alphabetMarker [alphabetIndex] = נכון; }} עבור (אינדקס בוליאני: alphabetMarker) {if (! index) {return false; }} להחזיר אמת; }

בואו נבדוק את היישום שלנו:

@Test public void givenValidString_isPanagram_shouldReturnSuccess () {String input = "שני שקעים מונעים עוזרים בפקס לחידון הגדול שלי"; assertTrue (Pangram.isPangram (קלט)); }

4. שימוש בזרמי ג'אווה

גישה חלופית כוללת שימוש ב- API של Java Streams. אנחנו יכולים ליצור זרם תווים מסונן מתוך טקסט הקלט הנתון וליצור אלפבית מַפָּה באמצעות הזרם.

הקוד מחזיר הצלחה אם גודל ה- מַפָּה שווה לגודל האלף-בית. עבור אנגלית, הגודל הצפוי הוא 26:

בוליאני סטטי ציבורי isPangramWithStreams (מחרוזת str) {if (str == null) {return false; } מחרוזת strUpper = str.toUpperCase (); זרם filteredCharStream = strUpper.chars () .filter (פריט -> ((item> = 'A' && פריט (char) c); מפה alphabetMap = filteredCharStream.collect (Collectors.toMap (פריט -> פריט, k -> בוליאני . TRUE, (p1, p2) -> p1)); להחזיר alphabetMap.size () == ALPHABET_COUNT;}

וכמובן, בואו נבדוק:

@Test public void givenValidString_isPangramWithStreams_shouldReturnSuccess () {String input = "השועל החום המהיר קופץ מעל הכלב העצלן"; assertTrue (Pangram.isPangramWithStreams (קלט)); }

5. שינוי לפנגרמות מושלמות

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

הקוד חוזר נָכוֹן כאשר שניהם מַפָּה גודל שווה לגודל האלף בית והתדירות של כל תו באלף בית היא בדיוק אחת:

ציבורי בוליאני סטטי ציבורי isPerfectPangram (String str) {if (str == null) {return false; } מחרוזת strUpper = str.toUpperCase (); זרם filteredCharStream = strUpper.chars () .filter (item -> ((item> = 'A' && item (char) c); AlfabetFrequencyMap = filteredCharStream.collect (Collectors.groupingBy (Function.identity (), Collectors.counting) ())); להחזיר alphabetFrequencyMap.size () == ALPHABET_COUNT && alphabetFrequencyMap.values ​​(). stream (). allMatch (item -> item == 1);}

ובואו לבדוק:

@ מבחן חלל ציבורי givenPerfectPangramString_isPerfectPangram_shouldReturnSuccess () {קלט מחרוזת = "abcdefghijklmNoPqrStuVwxyz"; assertTrue (Pangram.isPerfectPangram (קלט)); }

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

קלט מחרוזת = "שני ג'וקים מונעים עוזרים בפקס לחידון הגדול שלי"; assertFalse (Pangram.isPerfectPangram (קלט));

בקוד לעיל, לקלט המחרוזת הנתון יש כמה כפילויות, כמו שיש לו שני o. מכאן שהתפוקה היא שֶׁקֶר.

5. מסקנה

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

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

דוגמת הקוד זמינה ב- GitHub.


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