Del en liste i Java

1. Oversikt

I denne opplæringen vil jeg illustrere hvordan du deler en liste i flere underlister av en gitt størrelse.

For en relativt enkel operasjon er det overraskende ingen støtte i standard Java-samlings-API-ene. Heldigvis har både Guava og Apache Commons Collections implementert operasjonen på en lignende måte.

Denne artikkelen er en del avJava - Tilbake til Basic”-Serien her på Baeldung.

2. Bruk Guava til å dele listen

Guava muliggjør deling av listen i underlister av en spesifisert størrelse - via de Lister. Partisjon operasjon:

@Test public void givenList_whenParitioningIntoNSublists_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Liste subSets = Lists.partition (intList, 3); Liste lastPartition = subSets.get (2); Liste expectLastPartition = Lister. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (expectedLastPartition)); }

3. Bruk Guava til å dele en samling

Partisjonere en samling er også mulig med Guava:

@Test offentlig ugyldig gittCollection_whenParitioningIntoNSublists_thenCorrect () {Collection intCollection = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Iterabel subSets = Iterables.partition (intCollection, 3); Liste firstPartition = subSets.iterator (). Neste (); Liste forventetLastPartisjon = Lister. newArrayList (1, 2, 3); assertThat (firstPartition, equalTo (expectedLastPartition)); }

Husk at partisjonene er del listen over originalsamlingen - som betyr at endringer i den originale samlingen vil gjenspeiles i partisjonene:

@Test offentlig ugyldig givenListPartitioned_whenOriginalListIsModified_thenPartitionsChangeAsWell () {// Gitt liste intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Liste subSets = Lists.partition (intList, 3); // Når intList.add (9); // Deretter viser du lastPartition = subSets.get (2); Liste forventetLastPartisjon = Lister. newArrayList (7, 8, 9); assertThat (lastPartition, equalTo (expectedLastPartition)); }

4. Bruk Apache Commons-samlinger til å dele listen

De siste utgivelsene av Apache Commons Collections har nylig lagt til støtte for partisjonering av en liste også:

@Test public void givenList_whenParitioningIntoNSublists_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Liste subSets = ListUtils.partition (intList, 3); Liste lastPartition = subSets.get (2); Liste expectLastPartition = Lister. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (expectedLastPartition)); }

Det er ikke noe tilsvarende alternativ for å partisjonere en rå samling - ligner på Guava Iterables.partition i Commons Collections.

Til slutt gjelder den samme advarselen også her - den resulterende partisjonen er visninger av den opprinnelige listen.

5. Bruk Java8 til å partisjonere listen

La oss nå se hvordan du bruker Java8 til å dele vår liste.

5.1. Samlere partisjonering av

Vi kan bruke Collectors.partitioningBy () å dele listen opp i to underlister - som følger:

@Test offentlig ugyldig gittList_whenParitioningIntoSublistsUsingPartitionBy_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Kart grupper = intList.stream (). samle (Collectors.partitioningBy (s -> s> 6)); Liste subSets = new ArrayList(grupper.verdier ()); Liste lastPartition = subSets.get (1); Liste expectLastPartition = Lister. newArrayList (7, 8); assertThat (subSets.size (), equalTo (2)); assertThat (lastPartition, equalTo (expectedLastPartition)); }

Merk: De resulterende partisjonene er ikke et syn på hovedlisten, så eventuelle endringer i hovedlisten påvirker ikke partisjonene.

5.2. Samlere gruppering av

Vi kan også bruke Collectors.groupingBy () for å dele listen vår til flere partisjoner:

@Test offentlig endelig ugyldighet gittList_whenParitioningIntoNSublistsUsingGroupingBy_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Kart grupper = intList.stream (). samle (Collectors.groupingBy (s -> (s - 1) / 3)); Liste subSets = new ArrayList(grupper.verdier ()); Liste lastPartition = subSets.get (2); Liste expectLastPartition = Lister. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (expectedLastPartition)); }

Merk: Akkurat som Collectors.partitioningBy () - de resulterende partisjonene blir ikke påvirket av endringer i hovedlisten.

5.3. Del listen etter skilletegn

Vi kan også bruke Java8 til å dele listen vår med skilletegn:

@Test offentlig ugyldig givenList_whenSplittingBySeparator_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 0, 4, 5, 6, 0, 7, 8); int [] indekser = Stream.of (IntStream.of (-1), IntStream.range (0, intList.size ()) .filter (i -> intList.get (i) == 0), IntStream.of ( intList.size ())) .flatMapToInt (s -> s) .toArray (); Liste subSets = IntStream.range (0, indexes.length - 1) .mapToObj (i -> intList.subList (indexes [i] + 1, indexes [i + 1])) .collect (Collectors.toList ()); Liste lastPartition = subSets.get (2); Liste expectLastPartition = Lister. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (expectedLastPartition)); }

Merk: Vi brukte "0" som skilletegn - vi fikk først indeksene til alle "0" -elementene i listen, deretter delte vi Liste på disse indeksene.

6. Konklusjon

Løsningene som presenteres her, bruker ekstra biblioteker - Guava eller Apache Commons Collections-biblioteket. Begge disse er veldig lette og ekstremt nyttige generelt, så det er veldig fornuftig å ha en av dem på klassestien; Men hvis dette ikke er et alternativ - vises en eneste Java-løsning her.

Implementeringen av alle disse eksemplene og kodebiter kan du finne på GitHub- dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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