Partíció egy listát Java-ban

1. Áttekintés

Ebben az oktatóanyagban szemléltetem hogyan lehet felosztani egy listát több allistára adott méretű.

Egy viszonylag egyszerű művelethez meglepő módon nincs támogatás a standard Java gyűjteményi API-kban. Szerencsére a Guava és az Apache Commons gyűjtemények is hasonló módon hajtották végre a műveletet.

Ez a cikk a „Java - Vissza az alapokhoz”Sorozat itt, a Baeldungon.

2. A Guava segítségével ossza meg a listát

A Guava megkönnyíti a Lista felosztását meghatározott méretű allistákra - via a Listák.partíció művelet:

@Test public void givenList_whenParitioningIntoNSublists_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Lista subSets = Lists.partition (intList, 3); List lastPartition = subSets.get (2); List várhatóLastPartition = Listák. newArrayList (7, 8); assertThat (subSets.size (), egyenlőTo (3)); assertThat (lastPartition, equTo (várhatóLastPartition)); }

3. A Guava segítségével ossza meg a gyűjteményt

Gyűjtemény felosztása Guava-val is lehetséges:

@Test public void givenCollection_whenParitioningIntoNSublists_thenCorrect () {Collection intCollection = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Iterálható subSets = Iterables.partition (intCollection, 3); List firstPartition = subSets.iterator (). Next (); List várhatóLastPartition = Listák. newArrayList (1, 2, 3); assertThat (firstPartition, equTo (várhatóLastPartition)); }

Ne feledje, hogy a partíciók vannak felsorolja az eredeti gyűjtemény nézeteit - ami azt jelenti, hogy az eredeti gyűjtemény változásai a partíciókban is megjelennek:

@Test public void givenListPartitioned_whenOriginalListIsModified_thenPartitionsChangeAsWell () {// Adott lista intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Lista subSets = Lists.partition (intList, 3); // Amikor intList.add (9); // Ezután sorolja fel lastPartition = subSets.get (2); List várhatóLastPartition = Listák. newArrayList (7, 8, 9); assertThat (lastPartition, equTo (várhatóLastPartition)); }

4. Az Apache Commons Gyűjtemények segítségével ossza fel a listát

Az Apache Commons Collections legújabb kiadásai nemrégiben támogatást nyújtottak egy lista felosztásához is:

@Test public void givenList_whenParitioningIntoNSublists_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Lista subSets = ListUtils.partition (intList, 3); List lastPartition = subSets.get (2); List várhatóLastPartition = Listák. newArrayList (7, 8); assertThat (subSets.size (), egyenlőTo (3)); assertThat (lastPartition, equTo (várhatóLastPartition)); }

Van nincs megfelelő opció a nyers Gyűjtemény particionálására - hasonló a Guava Iterables.partícióhoz a Commons gyűjteményekben.

Végül ugyanaz a figyelmeztetés érvényes itt is - a kapott partíció az eredeti Lista nézete.

5. A Java8 segítségével ossza meg a listát

Most nézzük meg, hogyan használhatjuk a Java8-at a Listánk felosztásához.

5.1. Gyűjtők particionálásBy

Tudjuk használni Collectors.partitioningBy () a lista 2 allistára bontása - az alábbiak szerint:

@Test public void givenList_whenParitioningIntoSublistsUsingPartitionBy_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Térkép csoportok = intList.stream (). gyűjt (Collectors.partitioningBy (s -> s> 6)); Lista subSets = új ArrayList(csoportok.értékek ()); List lastPartition = subSets.get (1); List várhatóLastPartition = Listák. newArrayList (7, 8); assertThat (subSets.size (), egyenlőTo (2)); assertThat (lastPartition, equTo (várhatóLastPartition)); }

Megjegyzés: Az eredményül kapott partíciók nem a fő lista nézetei, ezért a fő listán bekövetkező bármilyen változás nem befolyásolja a partíciókat.

5.2. Gyűjtők csoportosításBy

Mi is használhatjuk Collectors.groupingBy () hogy feloszthassuk listánkat több partícióra:

@Test public final void givenList_whenParitioningIntoNSublistsUsingGroupingBy_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Térkép csoportok = intList.stream (). gyűjt (Collectors.groupingBy (s -> (s - 1) / 3)); Lista subSets = új ArrayList(csoportok.értékek ()); List lastPartition = subSets.get (2); List várhatóLastPartition = Listák. newArrayList (7, 8); assertThat (subSets.size (), egyenlőTo (3)); assertThat (lastPartition, equTo (várhatóLastPartition)); }

Megjegyzés: Csakúgy Collectors.partitioningBy () - az eredményül kapott partíciókat a fő lista változásai nem érintik.

5.3. Ossza fel a listát elválasztó szerint

A Java8 segítségével fel is oszthatjuk a listánkat elválasztó szerint:

@Test public void givenList_whenSplittingBySeparator_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 0, 4, 5, 6, 0, 7, 8); int [] indexek = Stream.of (IntStream.of (-1), IntStream.range (0, intList.size ()) .filter (i -> intList.get (i) == 0), IntStream.of ( intList.size ())) .flatMapToInt (s -> s) .toArray (); Lista subSets = IntStream.range (0, indexes.length - 1) .mapToObj (i -> intList.subList (indexek [i] + 1, indexek [i + 1])) .collect (Collectors.toList ()); List lastPartition = subSets.get (2); List várhatóLastPartition = Listák. newArrayList (7, 8); assertThat (subSets.size (), egyenlőTo (3)); assertThat (lastPartition, equTo (várhatóLastPartition)); }

Megjegyzés: A „0” -t választottuk el elválasztóként - először a listán szereplő összes „0” elem Lista ezeken az indexeken.

6. Következtetés

Az itt bemutatott megoldások további könyvtárakat használnak - Guava vagy az Apache Commons Collections könyvtár. Mindkettő nagyon könnyű és összességében rendkívül hasznos, ezért teljesen logikus, ha egyikük az osztályúton van; azonban ha ez nem opció - itt csak a Java megoldást mutatjuk be.

Mindezen példák és kódrészletek megvalósítása megtalálható a GitHubon- ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.