Partitioneer een lijst in Java

1. Overzicht

In deze tutorial zal ik illustreren hoe u een lijst opsplitst in verschillende sublijsten van een bepaalde maat.

Voor een relatief eenvoudige bewerking is er verrassend genoeg geen ondersteuning in de standaard Java-verzameling-API's. Gelukkig hebben zowel Guava als de Apache Commons Collections de operatie op een vergelijkbare manier geïmplementeerd.

Dit artikel maakt deel uit van de “Java - Terug naar Basic”Serie hier op Baeldung.

2. Gebruik Guava om de lijst te partitioneren

Guava vergemakkelijkt het partitioneren van de lijst in sublijsten van een bepaalde grootte - via de Lists.partition operatie:

@Test openbare ongeldig gegevenList_whenParitioningIntoNSublists_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Lijst subSets = Lists.partition (intList, 3); Lijst lastPartition = subSets.get (2); Lijst verwachteLastPartition = Lijsten. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (verwachteLastPartitie)); }

3. Gebruik Guava om een ​​verzameling te partitioneren

Een collectie partitioneren is ook mogelijk met Guava:

@Test openbare leegte gegevenCollection_whenParitioningIntoNSublists_thenCorrect () {Collectie intCollection = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Herhaalbaar subSets = Iterables.partition (intCollection, 3); Lijst firstPartition = subSets.iterator (). Next (); Lijst verwachteLastPartition = Lijsten. newArrayList (1, 2, 3); assertThat (firstPartition, equalTo (verwachteLastPartitie)); }

Houd er rekening mee dat de partities sublijstweergaven van de originele collectie - wat betekent dat wijzigingen in de oorspronkelijke collectie worden weerspiegeld in de scheidingswanden:

@Test openbare leegte gegevenListPartitioned_whenOriginalListIsModified_thenPartitionsChangeAsWell () {// Gegeven lijst intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Lijst subSets = Lists.partition (intList, 3); // Wanneer intList.add (9); // Maak een lijst van lastPartition = subSets.get (2); Lijst verwachteLastPartition = Lijsten. newArrayList (7, 8, 9); assertThat (lastPartition, equalTo (verwachteLastPartitie)); }

4. Gebruik Apache Commons-verzamelingen om de lijst te partitioneren

De nieuwste releases van Apache Commons Collections hebben onlangs ook ondersteuning toegevoegd voor het partitioneren van een lijst:

@Test openbare ongeldig gegevenList_whenParitioningIntoNSublists_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Lijst subSets = ListUtils.partition (intList, 3); Lijst lastPartition = subSets.get (2); Lijst verwachteLastPartition = Lijsten. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (verwachteLastPartitie)); }

Er is geen overeenkomstige optie om een ​​onbewerkte verzameling te partitioneren - vergelijkbaar met de Guava Iterables.-partitie in Commons Collections.

Ten slotte geldt ook hier hetzelfde voorbehoud - de resulterende partitie zijn weergaven van de originele lijst.

5. Gebruik Java8 om de lijst te partitioneren

Laten we nu eens kijken hoe we Java8 kunnen gebruiken om onze lijst te partitioneren.

5.1. Verzamelaars partitioneren

We kunnen gebruiken Collectors.partitioningBy () om de lijst op te splitsen in 2 sublijsten - als volgt:

@Test openbare ongeldig gegevenList_whenParitioningIntoSublistsUsingPartitionBy_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Kaart groups = intList.stream (). collect (Collectors.partitioningBy (s -> s> 6)); Lijst subSets = nieuwe ArrayList(groups.values ​​()); Lijst lastPartition = subSets.get (1); Lijst verwachteLastPartition = Lijsten. newArrayList (7, 8); assertThat (subSets.size (), equalTo (2)); assertThat (lastPartition, equalTo (verwachteLastPartitie)); }

Opmerking: De resulterende partities zijn geen weergave van de hoofdlijst, dus eventuele wijzigingen aan de hoofdlijst hebben geen invloed op de partities.

5.2. Verzamelaars groupingBy

We kunnen ook gebruiken Collectors.groupingBy () om onze lijst op te splitsen in meerdere partities:

@Test openbare definitieve ongeldig gegevenList_whenParitioningIntoNSublistsUsingGroupingBy_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 4, 5, 6, 7, 8); Kaart groups = intList.stream (). collect (Collectors.groupingBy (s -> (s - 1) / 3)); Lijst subSets = nieuwe ArrayList(groups.values ​​()); Lijst lastPartition = subSets.get (2); Lijst verwachteLastPartition = Lijsten. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (verwachteLastPartitie)); }

Opmerking: net zoals Collectors.partitioningBy () - de resulterende partities worden niet beïnvloed door wijzigingen in de hoofdlijst.

5.3. Splits de lijst op scheidingsteken

We kunnen ook Java8 gebruiken om onze lijst op scheidingsteken te splitsen:

@Test openbare ongeldig gegevenList_whenSplittingBySeparator_thenCorrect () {List intList = Lists.newArrayList (1, 2, 3, 0, 4, 5, 6, 0, 7, 8); int [] indexes = Stream.of (IntStream.of (-1), IntStream.range (0, intList.size ()) .filter (i -> intList.get (i) == 0), IntStream.of ( intList.size ())) .flatMapToInt (s -> s) .toArray (); Lijst subSets = IntStream.range (0, indexes.length - 1) .mapToObj (i -> intList.subList (indexen [i] + 1, indexen [i + 1])) .collect (Collectors.toList ()); Lijst lastPartition = subSets.get (2); Lijst verwachteLastPartition = Lijsten. newArrayList (7, 8); assertThat (subSets.size (), equalTo (3)); assertThat (lastPartition, equalTo (verwachteLastPartitie)); }

Opmerking: we gebruikten "0" als scheidingsteken - we kregen eerst de indices van alle "0" -elementen in de lijst, daarna splitsten we de Lijst op deze indices.

6. Conclusie

De hier gepresenteerde oplossingen maken gebruik van aanvullende bibliotheken - Guava of de Apache Commons Collections-bibliotheek. Beide zijn erg licht van gewicht en buitengewoon handig in het algemeen, dus het is volkomen logisch om er een op het klassenpad te hebben; Als dat echter geen optie is, wordt hier een oplossing voor alleen Java getoond.

De implementatie van al deze voorbeelden en codefragmenten is te vinden op GitHub- dit is een op Maven gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.


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