Word lid van Array of Primitives met Separator in Java

1. Inleiding

In deze korte handleiding leren we hoe u dat moet doen sluit u aan bij een array van primitieven met een scheidingsteken van één teken in Java. Voor onze voorbeelden zullen we twee arrays beschouwen: een array van int en een reeks van char.

2. Het probleem definiëren

Laten we beginnen met het definiëren van een reeks int en een reeks van char voor de voorbeelden, evenals het scheidingsteken dat we zullen gebruiken om hun inhoud samen te voegen:

int [] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9}; char [] charArray = {'a', 'b', 'c', 'd', 'e', ​​'f'}; char separatorChar = '-'; String separator = String.valueOf (separatorChar); 

Merk op dat we zowel een char en Draad scheidingsteken sinds sommige van de methoden die we zullen laten zien, vereisen een char argument, terwijl anderen een Draad argument.

De resultaten van de samenvoegingsoperatie bevatten “1-2-3-4-5-6-7-8-9” voor de int array en "A-b-c-d-e-f" voor de char array.

3. Collectors.joining ()

Laten we beginnen met een van de beschikbare methoden van de Java 8 Stream API - Collectors.joining ().

Eerst maken we een Stroom van een reeks primitieven die de Arrays.stream () methode gevonden in de java.util pakket. Vervolgens wijzen we elk element toe aan Draad. En tot slot voegen we de elementen samen met ons gegeven scheidingsteken.

Laten we beginnen met onze int matrix:

String samengevoegd = Arrays.stream (intArray) .mapToObj (String :: valueOf) .collect (Collectors.joining (scheidingsteken));

Wanneer je lid wordt van ons char array met deze methode, moeten we eerst de char array in CharBuffer en projecteer het vervolgens naar char opnieuw. Dit komt doordat de tekens () methode retourneert een Stroom van int waarden.

Helaas biedt de Java Stream API geen native methode voor het inpakken van een Stroom van char.

Laten we ons aansluiten bij onze char matrix:

String samengevoegd = CharBuffer.wrap (charArray) .chars () .mapToObj (intValue -> String.valueOf ((char) intValue)) .collect (Collectors.joining (scheidingsteken));

4. StringJoiner

gelijk aan Collectors.joining (), deze benadering maakt gebruik van de Stream API, maar in plaats van elementen te verzamelen, itereert het door elementen en voegt deze toe aan een StringJoiner voorbeeld:

StringJoiner intStringJoiner = nieuwe StringJoiner (scheidingsteken); Arrays.stream (intArray) .mapToObj (String :: valueOf) .forEach (intStringJoiner :: add); String samengevoegd = intStringJoiner.toString ();

Nogmaals, we moeten onze inpakken char array in CharBuffer bij gebruik van de Stream API:

StringJoiner charStringJoiner = nieuwe StringJoiner (scheidingsteken); CharBuffer.wrap (charArray) .chars () .mapToObj (intChar -> String.valueOf ((char) intChar)) .forEach (charStringJoiner :: add); String samengevoegd = charStringJoiner.toString ();

5. Apache Commons Lang

De Apache Commons Lang-bibliotheek biedt enkele handige methoden in de StringUtils en ArrayUtils klassen die we kunnen gebruiken om deel te nemen aan onze primitieve arrays.

Om deze bibliotheek te gebruiken, moeten we het commons-lang3 afhankelijkheid van onze pom.xml:

 org.apache.commons commons-lang3 3.8.1 

Bij het werken met een Draad separator, we maken gebruik van beide StringUtils en ArrayUtils.

Laten we deze samen gebruiken om ons bij ons aan te sluiten int matrix:

String samengevoegd = StringUtils.join (ArrayUtils.toObject (intArray), scheidingsteken);

Of, als we een primitief gebruiken char typ als scheidingsteken, we kunnen eenvoudig schrijven:

String samengevoegd = StringUtils.join (intArray, separatorChar);

De implementaties om lid te worden van ons char array zijn vrij gelijkaardig:

String samengevoegd = StringUtils.join (ArrayUtils.toObject (charArray), scheidingsteken);

En bij gebruik van een char scheidingsteken:

String samengevoegd = StringUtils.join (charArray, separatorChar);

6. Guave

De Guava-bibliotheek van Google biedt de Schrijnwerker klasse die we kunnen gebruiken om deel te nemen aan onze arrays. Om Guava in ons project te gebruiken, moeten we het guave Maven-afhankelijkheid:

 com.google.guava guave 27.0.1-jre 

Laten we ons aansluiten bij onze int array met behulp van de Schrijnwerker klasse:

String samengevoegd = Joiner.on (scheidingsteken) .join (Ints.asList (intArray));

In dit voorbeeld hebben we ook de Ints.asList () methode van Guava, die de reeks primitieven mooi omzet in een Lijst van Geheel getal.

Guava biedt een vergelijkbare methode om een char array naar een Lijst van Karakter. Als gevolg hiervan toetreden tot onze char array lijkt erg op het bovenstaande voorbeeld dat de int matrix:

String samengevoegd = Joiner.on (scheidingsteken) .join (Chars.asList (charArray));

7. StringBuilder

Tenslotte, als we geen gebruik kunnen maken van Java 8 of bibliotheken van derden, kunnen we handmatig een reeks elementen samenvoegen met StringBuilder. In dit geval is de implementatie identiek voor beide typen arrays:

if (array.length == 0) {return ""; } StringBuilder stringBuilder = nieuwe StringBuilder (); voor (int i = 0; i <array.length - 1; i ++) {stringBuilder.append (array [i]); stringBuilder.append (scheidingsteken); } stringBuilder.append (array [array.length - 1]); String samengevoegd = stringBuilder.toString ();

8. Conclusie

Dit korte artikel illustreert een aantal manieren om een ​​reeks primitieven samen te voegen met een bepaald scheidingsteken of een bepaalde tekenreeks. We lieten voorbeelden zien met native JDK-oplossingen, evenals aanvullende oplossingen met twee bibliotheken van derden: Apache Commons Lang en Guava.

Zoals altijd is de volledige code die in dit artikel wordt gebruikt, beschikbaar op GitHub.