כיצד למצוא אלמנט ברשימה עם Java

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

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

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

2. התקנה

ראשית נתחיל בהגדרת א צרכן POJO:

לקוח ממעמד ציבורי {מזהה פרטי פרטי; שם מחרוזת פרטי; // getters / setters, hashcode מותאם אישית / שווה}

ואז רשימת מערך לקוחות:

רשימת לקוחות = ArrayList חדש (); clients.add (לקוח חדש (1, "ג'ק")); clients.add (לקוח חדש (2, "ג'יימס")); clients.add (לקוח חדש (3, "קלי")); 

שים לב שעקפנו hashCode ו שווים בשלנו צרכן מעמד.

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

נשתמש ברשימה זו של לקוחות בדרך.

3. שימוש ב- Java API

ג'אווה עצמה מספקת מספר דרכים למציאת פריט ברשימה:

  • ה מכיל שיטה
  • ה אינדקס של שיטה
  • אד-הוק לולאה
  • ה זרם ממשק API

3.1. מכיל ()

רשימה חושף שיטה שנקראת מכיל:

מכיל בוליאני (אלמנט אובייקט)

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

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

לקוח ג'יימס = לקוח חדש (2, "ג'יימס"); אם (clients.contains (james)) {// ...}

3.2. אינדקס של()

אינדקס של היא שיטה שימושית נוספת למציאת אלמנטים:

int indexOf (אלמנט אובייקט)

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

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

אם (clients.indexOf (james)! = -1) {// ...}

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

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

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

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

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

לקוח ציבורי findUsingEnhancedForLoop (שם מחרוזת, לקוחות ברשימה) {עבור (לקוח לקוח: לקוחות) {אם (customer.getName (). שווה (שם)) {לקוח חוזר; }} להחזיר null; }

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

3.4. לולאה עם איטרטור

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

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

לקוח findUsingIterator ציבורי (שם מחרוזת, לקוחות רשימה) {Iterator iterator = customers.iterator (); בעוד (iterator.hasNext ()) {לקוח לקוח = iterator.next (); אם (customer.getName (). שווה ל- (name)) {לקוח חוזר; }} להחזיר null; }

כתוצאה מכך ההתנהגות זהה לקודם.

3.5. ג'אווה 8 זרם ממשק API

נכון ל- Java 8, אנו יכולים גם להשתמש ב- זרם API למציאת אלמנט ב- רשימה.

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

  • לעורר זרם() ברשימה
  • תתקשר ל filter () שיטה עם תקין לְבַסֵס
  • תתקשר ל findAny () לבנות, אשר חוזר האלמנט הראשון התואם את לְסַנֵן פרדיקט עטוף ב אופציונאלי אם קיים אלמנט כזה

לקוח ג'יימס = clients.stream () .filter (לקוח -> "James" .equals (customer.getName ())) .findAny () .orElse (null);

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

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

כעת, בעוד שממשק ה- API של Stream הוא די והותר, מה עלינו לעשות אם אנו תקועים בגירסה קודמת של Java?

למרבה המזל, ישנן ספריות צד שלישי רבות כמו Google Guava ו- Apache Commons בהן אנו יכולים להשתמש.

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

Google Guava מספק פונקציונליות הדומה למה שאנחנו יכולים לעשות עם זרמים:

Customer james = Iterables.tryFind (לקוחות, Predicate חדש) {{בוליאני ציבורי חל (לקוח לקוח) {להחזיר "James" .equals (customer.getName ());}}). OrNull ();

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

לקוח james = Iterables.tryFind (לקוחות, Predicate חדש) ({בוליאני ציבורי חל (לקוח לקוח) {להחזיר "ג'יימס". שווה (customer.getName ());}}). או (clients.get (0));

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

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

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

אנו יכולים למצוא אלמנט כמעט באותו אופן באמצעות Apache Commons:

לקוח ג'יימס = IterableUtils.find (לקוחות, פרדיקט חדש () {הערכה בוליאנית ציבורית (לקוח לקוח) {להחזיר "ג'יימס". שווה (customer.getName ());}});

ישנם כמה הבדלים חשובים:

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

5. מסקנה

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

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

תודה שעצרת במקום, וזכור לבדוק את כל המקורות לדוגמאות אלה ב- GitHub.


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