מציאת ההבדלים בין שתי רשימות בג'אווה

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

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

ב ג'אווה, אין דרך מפורשת למצוא הבדלים בין שתי רשימות ב- רשימה API, אם כי יש כמה שיטות עוזרות שמתקרבות.

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

2. הגדרת בדיקה

נתחיל בהגדרת שתי רשימות, בהן נשתמש כדי לבדוק את הדוגמאות שלנו:

מחלקה ציבורית FindDifferencesBetweenListsUnitTest {private final final list listOne = Arrays.asList ("Jack", "Tom", "Sam", "John", "James", "Jack"); סופי סטטי פרטי רשימת listTwo = Arrays.asList ("ג'ק", "דניאל", "סם", "אלן", "ג'יימס", "ג'ורג '"); }

3. שימוש בג'אווה רשימה ממשק API

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

הבדלי רשימה = ArrayList חדש (listOne); difference.removeAll (listTwo); assertEquals (2, difference.size ()); טוען כי (הבדלים). מכיל בדיוק ("טום", "ג'ון");

בואו נהפוך זאת כדי למצוא את ההבדלים להיפך:

הבדלי רשימה = ArrayList חדש (listTwo); difference.removeAll (listOne); assertEquals (3, difference.size ()); טוען כי (הבדלים). מכיל בדיוק ("דניאל", "אלן", "ג'ורג '");

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

4. שימוש ב- API של Streams

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

הבדלי רשימה = listOne.stream () .filter (element ->! ListTwo.contains (element)) .collect (Collectors.toList ()); assertEquals (2, difference.size ()); טוען כי (הבדלים). מכיל בדיוק ("טום", "ג'ון");

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

הבדלי רשימה = listTwo.stream () .filter (element ->! ListOne.contains (element)) .collect (Collectors.toList ()); assertEquals (3, difference.size ()); טוען כי (הבדלים). מכיל בדיוק ("דניאל", "אלן", "ג'ורג '");

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

5. שימוש ספריות צד שלישי

5.1. שימוש בגוגל גויאבה

גויאבה מכיל שימושי סטים.הֶבדֵל שיטהאבל כדי להשתמש בו עלינו להמיר תחילה את שלנו רשימה אל א מַעֲרֶכֶת:

הבדלי רשימה = ArrayList חדש (Sets.difference (Sets.newHashSet (listOne), Sets.newHashSet (listTwo))); assertEquals (2, difference.size ()); assertThat (הבדלים) .containsExactlyInAnyOrder ("טום", "ג'ון");

עלינו לציין כי המרת ה- רשימה אל א מַעֲרֶכֶת תהיה השפעה של כפל וכיוונו מחדש.

5.2. שימוש באוספי Apache Commons

ה אוסף כלי עזר כיתה מ אוספי Apache Commons מכיל א להסיר את כל שיטה.

שיטה זו עושה את כמו רשימה.להסיר את כל, תוך יצירת אוסף חדש לתוצאה:

הבדלי רשימה = ArrayList חדש ((CollectionUtils.removeAll (listOne, listTwo))); assertEquals (2, difference.size ()); טוען כי (הבדלים). מכיל בדיוק ("טום", "ג'ון");

6. טיפול בערכים כפולים

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

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

בדוגמה שלנו, הערך "ג'ֵק" מופיע פעמיים ברשימה הראשונה ורק פעם אחת ברשימה השנייה:

הבדלי רשימה = ArrayList חדש (listOne); listTwo.forEach (הבדלים :: הסר); טוען כי (הבדלים). מכיל בדיוק ("טום", "ג'ון", "ג'ק");

אנו יכולים להשיג זאת גם באמצעות להחסיר שיטה מ אוספי Apache Commons:

הבדלי רשימה = ArrayList חדש (CollectionUtils.subtract (listOne, listTwo)); assertEquals (3, difference.size ()); טוען כי (הבדלים). מכיל בדיוק ("טום", "ג'ון", "ג'ק");

7. מסקנה

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

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

ראינו גם כיצד לטפל בערכים כפולים.

כמו תמיד, קוד המקור השלם זמין ב- GitHub.


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