Podijelite popis na Javi

1. Pregled

U ovom uputstvu ilustrirat ću kako podijeliti Popis na nekoliko podlista zadane veličine.

Za relativno jednostavan rad, iznenađujuće nema podrške u standardnim API-ima za prikupljanje Java. Srećom, i Guava i Apache Commons Collection provodili su operaciju na sličan način.

Ovaj je članak dio „Java - Povratak na Basic”Serija ovdje na Baeldungu.

2. Upotrijebite Guavu za razdvajanje popisa

Guava olakšava raspodjelu popisa na podliste određene veličine - putem the Popisi.podjela operacija:

@Test javna praznina givenList_whenParitioningIntoNSublists_thenCorrect () {Popis intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Popis subSets = Lists.partition (intList, 3); Popis lastPartition = subSets.get (2); Popis očekuje seLastPartition = Popisi. newArrayList (7, 8); assertThat (subSets.size (), jednakTo (3)); assertThat (lastPartition, jednakTo (očekivaniLastPartition)); }

3. Upotrijebite Guavu za razdvajanje kolekcije

Dijeljenje zbirke je također moguće s Guavom:

@Test javna praznina givenCollection_whenParitioningIntoNSublists_thenCorrect () {Zbirka intCollection = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Iterativ subSets = Iterables.partition (intCollection, 3); Popis firstPartition = subSets.iterator (). Next (); Popis očekuje seLastPartition = Popisi. newArrayList (1, 2, 3); assertThat (firstPartition, jednakTo (očekivaniLastPartition)); }

Imajte na umu da su particije prikazi sublista izvorne zbirke - što znači da će se promjene u izvornoj zbirci odraziti na particije:

@Test javna praznina givenListPartitioned_whenOriginalListIsModified_thenPartitionsChangeAsWell () {// Dati popis intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Popis subSets = Lists.partition (intList, 3); // Kada intList.add (9); // Zatim navedite lastPartition = subSets.get (2); Popis očekuje seLastPartition = Popisi. newArrayList (7, 8, 9); assertThat (lastPartition, jednakTo (očekivaniLastPartition)); }

4. Upotrijebite zbirke Apache Commons da biste podijelili popis

Najnovija izdanja Apache Commons Collections nedavno su dodala i podršku za dijeljenje popisa:

@Test javna praznina givenList_whenParitioningIntoNSublists_thenCorrect () {Popis intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Popis subSets = ListUtils.partition (intList, 3); Popis lastPartition = subSets.get (2); Popis očekuje seLastPartition = Popisi. newArrayList (7, 8); assertThat (subSets.size (), jednakTo (3)); assertThat (lastPartition, jednakTo (očekivaniLastPartition)); }

Tamo je nema odgovarajuće opcije za particioniranje sirove zbirke - slično kao i Guava Iterables.dio u Commons Collections.

Konačno, isto upozorenje vrijedi i ovdje - rezultirajuća particija su pogledi izvornog Popisa.

5. Koristite Java8 za particioniranje popisa

Sada, da vidimo kako koristiti Java8 za particioniranje našeg Popisa.

5.1. Kolekcionari particioniranjeBy

Možemo koristiti Collectors.partitioningBy () da se popis podijeli na 2 podliste - kako slijedi:

@Test javna praznina givenList_whenParitioningIntoSublistsUsingPartitionBy_thenCorrect () {Popis intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Karta grupe = intList.stream (). collect (Collectors.partitioningBy (s -> s> 6)); Popis subSets = novi ArrayList(groups.values ​​()); Popis lastPartition = subSets.get (1); Popis očekuje seLastPartition = Popisi. newArrayList (7, 8); assertThat (subSets.size (), jednakTo (2)); assertThat (lastPartition, jednakTo (očekivaniLastPartition)); }

Napomena: Rezultirajuće particije nisu prikaz glavnog popisa, pa sve promjene na glavnom popisu neće utjecati na particije.

5.2. Kolekcionari grupiranjeBy

Također možemo koristiti Collectors.groupingBy () da podijelimo naš popis na više particija:

@Test javna konačna praznina givenList_whenParitioningIntoNSublistsUsingGroupingBy_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Karta groups = intList.stream (). collect (Collectors.groupingBy (s -> (s - 1) / 3)); Popis subSets = novi ArrayList(groups.values ​​()); Popis lastPartition = subSets.get (2); Popis očekuje seLastPartition = Popisi. newArrayList (7, 8); assertThat (subSets.size (), jednakTo (3)); assertThat (lastPartition, jednakTo (očekivaniLastPartition)); }

Napomena: Jednako kao Collectors.partitioningBy () - promjene na glavnom popisu neće utjecati na rezultirajuće particije.

5.3. Podijelite popis razdvajačem

Također možemo koristiti Java8 za razdvajanje popisa razdvajačem:

@Test javna praznina givenList_whenSplittingBySeparator_thenCorrect () {Popis intList = Lists.newArrayList (1, 2, 3, 0, 4, 5, 6, 0, 7, 8); int [] indeksi = Stream.of (IntStream.of (-1), IntStream.range (0, intList.size ()) .filter (i -> intList.get (i) == 0), IntStream.of ( intList.size ())) .flatMapToInt (s -> s) .toArray (); Popis subSets = IntStream.range (0, indexes.length - 1) .mapToObj (i -> intList.subList (indeksi [i] + 1, indeksi [i + 1])) .collect (Collectors.toList ()); Popis lastPartition = subSets.get (2); Popis očekuje seLastPartition = Popisi. newArrayList (7, 8); assertThat (subSets.size (), jednakTo (3)); assertThat (lastPartition, jednakTo (očekivaniLastPartition)); }

Napomena: Koristili smo "0" kao separator - prvo smo dobili indekse svih elemenata "0" na Popisu, a zatim smo podijelili Popis na ovim indeksima.

6. Zaključak

Ovdje predstavljena rješenja koriste se dodatnim knjižnicama - Guava ili Apache Commons Collections. Obje su vrlo lagane i u cjelini izuzetno korisne, pa je posve logično imati jednog od njih na stazi; međutim, ako to nije opcija - ovdje je prikazano rješenje samo za Javu.

Implementacija svih ovih primjera i isječaka koda možete pronaći na GitHubu- ovo je projekt zasnovan na Mavenu, pa bi ga trebalo biti lako uvesti i pokrenuti kakav jest.