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.