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.