קבע אם כל האלמנטים זהים ברשימת Java

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

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

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

2. דוגמא

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

notAllEqualList = Arrays.asList ("ג'ק", "ג'יימס", "סם", "ג'יימס"); emptyList = Arrays.asList (); allEqualList = Arrays.asList ("ג'ק", "ג'ק", "ג'ק", "ג'ק");

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

3. לולאה בסיסית

ראשית, נכון שכדי שכל האלמנטים יהיו שווים, כולם צריכים להיות שווים לאלמנט הראשון. בואו ננצל זאת בלולאה:

verify בוליאני ציבוריAllEqualUsingALoop (רשימת רשימה) {עבור (String s: list) {if (! s.equals (list.get (0))) return false; } להחזיר נכון; }

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

4. HashSet

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

verify בוליאני ציבוריAllEqualUsingHashSet (רשימת רשימה) {להחזיר HashSet חדש (רשימה). גודל () <= 1; }

המרת א רשימה ל HashSet עלויות עַל) זמן תוך כדי שיחה גודל לוקח O (1). לפיכך, עדיין יש לנו מורכבות זמן כוללת של עַל).

5. אוספים ממשק API

פיתרון נוסף הוא להשתמש ב- תדר (אוסף c, אובייקט o) שיטת ה- API של אוספים. שיטה זו מחזירה את מספר האלמנטים ב- a אוסף ג תואם אובייקט o.

לכן, אם תוצאת התדר שווה לגודל הרשימה, אנו יודעים שכל האלמנטים שווים:

אמת בוליאני ציבוריAllEqualUsingFrequency (רשימת רשימה) רשימת החזרה.isEmpty () 

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

6. זרמים

ה זרם API ב- Java 8 נותן לנו דרכים חלופיות עוד יותר לזהות אם כל הפריטים ברשימה שווים.

6.1. מוּבהָק()

בואו נסתכל על פתרון מסוים אחד המשתמש ב- מוּבהָק() שיטה.

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

verify בוליאני ציבוריAllEqualUsingStream (רשימת רשימה) {return list.stream () .distinct () .count () <= 1; }

אם ספירת זרם זה קטנה או שווה ל -1, אז כל האלמנטים שווים ואנחנו חוזרים נָכוֹן.

העלות הכוללת של הפעולה היא עַל), שזה הזמן שנדרש לעבור בין כל אלמנטים הזרם.

6.2. allMatch ()

ה זרם ממשקי API allMatch () השיטה מספקת פתרון מושלם כדי לקבוע אם כל האלמנטים של זרם זה תואמים את הקבץ המסופק:

verify בוליאני ציבורי AllEqualAnotherUsingStream (רשימת רשימה) רשימת החזרה.isEmpty () 

בדומה לדוגמא הקודמת של שימוש בזרמים, גם לזה יש עַל) מורכבות זמן, שזה הזמן לחצות את כל הזרם.

7. ספריות צד שלישי

אם אנו תקועים בגירסה קודמת של Java ואיננו יכולים להשתמש ב- API של Stream, אנו יכולים לעשות שימוש בספריות צד שלישי כגון גויאבה של גוגל ו אפאצ'י קומונס.

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

7.1. תלות Maven

כדי להשתמש באחד מהם, אנחנו יכולים להוסיף את אחד מהם גויאבה אוֹ 4 בהתאמה לפרויקט שלנו:

 com.google.guava גויאבה 23.0 
     org.apache.commons commons-collection4 4.1 

7.2. גויאבה של גוגל

ב גויאבה של גוגל, השיטה הסטטית Iterables.all () החזרות נָכוֹן אם כל האלמנטים ברשימה מספקים את הפרדיקט:

verifie בוליאני ציבוריAllEqualUsingGuava (רשימת רשימות) {החזר Iterables.all (רשימה, פרדיקט חדש () {בוליאני ציבורי חל (מחרוזות) {החזר שווה ערך (list.get (0));}}); }

7.3. אפאצ'י קומונס

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

בפרט, השיטה הסטטית IterableUtils.matchesAll () החזרות נָכוֹן אם כל האלמנטים ברשימה מספקים את הפרדיקט:

verify בוליאני ציבוריAllEqualUsingApacheCommon (רשימת רשימה) {return IterableUtils.matchesAll (list, org.apache.commons.collections4.Predicate () {הערכה בוליאנית ציבורית (String s) {return s.equals (list.get (0));} }); } 

8. מסקנה

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

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

וודא לבדוק את מערך הדוגמאות המלא ב- GitHub.


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