מחלק רשימה ב- Java

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

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

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

מאמר זה הוא חלק מה- "ג'אווה - חזרה לבסיסיסדרה כאן על באלדונג.

2. השתמש בגויאבה כדי לחלק את הרשימה

גויאבה מאפשר חלוקת הרשימה לרשימות משנה בגודל מוגדר - באמצעות ה רשימות. מחיצה מבצע:

@Test public void givenList_whenParitioningIntoNSublists_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); רשימה subSets = Lists.partition (intList, 3); רשימת lastPartition = subSets.get (2); רשימה expectLastPartition = רשימות. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (expectLastPartition)); }

3. השתמש בגויאבה כדי לחלק אוסף

חלוקת אוסף אפשרי גם עם גויאבה:

@ מבחן הריק פומבי שניתןCollection_whenParitioningIntoNSublists_thenCorrect () {Collection intCollection = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); ניתן לנידון subSets = Iterables.partition (intCollection, 3); רשום firstPartition = subSets.iterator (). הבא (); רשימה expectLastPartition = רשימות. newArrayList (1, 2, 3); assertThat (firstPartition, equalTo (expectLastPartition)); }

זכור כי המחיצות הן תצוגות רשימת המשנה של האוסף המקורי - כלומר שינויים באוסף המקורי יבואו לידי ביטוי במחיצות:

@Test public void givenListPartitioned_whenOriginalListIsModified_thenPartitionsChangeAsWell () {// רשימה נתונה intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); רשימה subSets = Lists.partition (intList, 3); // כאשר intList.add (9); // ואז רשימת lastPartition = subSets.get (2); רשימה expectLastPartition = רשימות. newArrayList (7, 8, 9); assertThat (lastPartition, equalTo (expectLastPartition)); }

4. השתמש באוספי Apache Commons כדי לחלק את הרשימה

המהדורות האחרונים של אוספי Apache Commons הוסיפו לאחרונה תמיכה גם בחלוקת רשימה:

@Test public void givenList_whenParitioningIntoNSublists_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); רשימה subSets = ListUtils.partition (intList, 3); רשימת lastPartition = subSets.get (2); רשימה expectLastPartition = רשימות. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (expectLastPartition)); }

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

לבסוף, אותה אזהרה חלה גם כאן - המחיצה המתקבלת היא תצוגות של הרשימה המקורית.

5. השתמש ב- Java8 כדי לחלק את הרשימה

עכשיו, בואו נראה איך להשתמש ב- Java8 כדי לחלק את הרשימה שלנו.

5.1. אספנים מחיצה מאת

אנחנו יכולים להשתמש Collectors.partitioningBy () לחלק את הרשימה לשתי רשימות משנה - כדלקמן:

@ מבחן הריק פומבי givenList_whenParitioningIntoSublistsUsingPartitionBy_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); מַפָּה קבוצות = intList.stream (). collect (Collectors.partitioningBy (s -> s> 6)); רשימה subSets = ArrayList חדש(group.values ​​()); רשימת lastPartition = subSets.get (1); רשימה expectLastPartition = רשימות. newArrayList (7, 8); assertThat (subSets.size (), equalTo (2)); assertThat (lastPartition, equalTo (expectLastPartition)); }

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

5.2. אספנים קיבוץ לפי

אנחנו גם יכולים להשתמש Collectors.groupingBy () לפצל את הרשימה שלנו למספר מחיצות:

@ מבחן סופי ציבורי בטל נתון List_whenParitioningIntoNSublistsUsingGroupingBy_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); מַפָּה קבוצות = intList.stream (). collect (Collectors.groupingBy (s -> (s - 1) / 3)); רשימה subSets = ArrayList חדש(group.values ​​()); רשימת lastPartition = subSets.get (2); רשימה expectLastPartition = רשימות. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (expectLastPartition)); }

הערה: בדיוק כמו Collectors.partitioningBy () המחיצות שנוצרו לא יושפעו משינויים ברשימה הראשית.

5.3. פצל את הרשימה לפי מפריד

אנו יכולים גם להשתמש ב- Java8 כדי לפצל את הרשימה לפי מפריד:

@Test הציבור בטל givenList_whenSplittingBySeparator_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 0, 4, 5, 6, 0, 7, 8); int [] אינדקסים = Stream.of (IntStream.of (-1), IntStream.range (0, intList.size ()) .filter (i -> intList.get (i) == 0), IntStream.of ( intList.size ())) .flatMapToInt (s -> s) .toArray (); רשימה subSets = IntStream.range (0, indexes.length - 1) .mapToObj (i -> intList.subList (אינדקסים [i] + 1, אינדקסים [i + 1])) .collect (Collectors.toList ()); רשימת lastPartition = subSets.get (2); רשימה expectLastPartition = רשימות. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (expectLastPartition)); }

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

6. מסקנה

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

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


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