Pripojte sa k skupine primitívov so separátorom v Jave
1. Úvod
V tejto rýchlej príručke sa dozvieme, ako na to spojiť pole primitívov s jednoznakovým oddeľovačom v Jave. Pre naše príklady zvážime dve polia: pole int a pole char.
2. Definovanie problému
Začnime definovaním poľa int a pole char pre príklady, ako aj znak oddeľovača, ktorý použijeme na spojenie ich obsahu:
int [] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9}; char [] charArray = {'a', 'b', 'c', 'd', 'e', 'f'}; char separatorChar = '-'; Oddeľovač reťazcov = String.valueOf (separatorChar);
Upozorňujeme, že sme zahrnuli obidve a char a String oddeľovač od niektoré z metód, ktoré ukážeme, vyžadujú char argument, zatiaľ čo iné vyžadujú a String argument.
Výsledky operácie spojenia budú obsahovať “1-2-3-4-5-6-7-8-9” pre int pole a "A b c d e f" pre char pole.
3. Collectors.joining ()
Začnime s jednou z dostupných metód z Java 8 Stream API - Collectors.joining ().
Najskôr vytvoríme a Prúd z radu primitívov pomocou Arrays.stream () metóda nájdená v java.util balíček. Ďalej každý prvok mapujeme na String. A nakoniec spojíme prvky s našim daným oddeľovačom.
Začnime s našimi int pole:
Reťazec spojený = Arrays.stream (intArray) .mapToObj (String :: valueOf) .collect (Collectors.joining (separator));
Pri vstupe do našej char pole s touto metódou, musíme najskôr zabaliť char pole do CharBuffer a potom to premietnuť na char ešte raz. Je to preto, lebo znaky () metóda vracia a Prúd z int hodnoty.
Rozhranie Java Stream API bohužiaľ neposkytuje natívnu metódu na zabalenie súboru a Prúd z char.
Pripojme sa k nášmu char pole:
Pripojený reťazec = CharBuffer.wrap (charArray) .chars () .mapToObj (intValue -> String.valueOf ((char) intValue)) .collect (Collectors.joining (separator));
4. StringJoiner
Podobne ako Collectors.joining (), tento prístup využíva Stream API, ale namiesto zhromažďovania prvkov iteruje cez prvky a pridáva ich do a StringJoiner inštancia:
StringJoiner intStringJoiner = nový StringJoiner (oddeľovač); Arrays.stream (intArray) .mapToObj (String :: valueOf) .forEach (intStringJoiner :: add); Reťazec spojený = intStringJoiner.toString ();
Opäť musíme zabaliť svoje char pole do CharBuffer pri použití Stream API:
StringJoiner charStringJoiner = nový StringJoiner (oddeľovač); CharBuffer.wrap (charArray) .chars () .mapToObj (intChar -> String.valueOf ((char) intChar)) .forEach (charStringJoiner :: add); Reťazec spojený = charStringJoiner.toString ();
5. Apache Commons Lang
Knižnica Apache Commons Lang poskytuje niektoré užitočné metódy v StringUtils a ArrayUtils triedy, ktoré môžeme použiť na pripojenie sa k našim primitívnym poliam.
Ak chcete používať túto knižnicu, budeme musieť pridať commons-lang3 závislosť na našom pom.xml:
org.apache.commons commons-lang3 3.8.1
Pri práci s a String oddeľovač, využijeme obe StringUtils a ArrayUtils.
Použime ich spolu, aby sme sa pripojili k našim int pole:
Reťazec spojený = StringUtils.join (ArrayUtils.toObject (intArray), oddeľovač);
Alebo, ak používame primitívu char zadajte ako oddeľovač, môžeme jednoducho napísať:
Reťazec spojený = StringUtils.join (intArray, separatorChar);
Implementácie pre pripojenie sa k nášmu char pole sú si dosť podobné:
Reťazec spojený = StringUtils.join (ArrayUtils.toObject (charArray), oddeľovač);
A pri použití a char oddeľovač:
Reťazec spojený = StringUtils.join (charArray, separatorChar);
6. Guava
Knižnica Guava spoločnosti Google poskytuje Stolár triedy, ktorú môžeme použiť na pripojenie sa k našim poliam. Ak chcete použiť Guava v našom projekte, budeme musieť pridať guava Závislosť Maven:
com.google.guava guava 27.0.1-jre
Pripojme sa k nášmu int pole pomocou Stolár trieda:
Reťazec spojený = Joiner.on (oddeľovač) .join (Ints.asList (intArray));
V tomto príklade sme použili aj znak Ints.asList () metóda od Guavy, ktorá pekne transformuje pole primitívov na a Zoznam z Celé číslo.
Guava ponúka podobnú metódu na prevod a char pole do a Zoznam z Postava. Výsledkom je, že sa pripojil k nášmu char pole vyzerá veľmi podobne ako vyššie uvedený príklad, ktorý používal int pole:
Reťazec spojený = Joiner.on (oddeľovač) .join (Chars.asList (charArray));
7. StringBuilder
Nakoniec Ak nemôžeme používať knižnice Java 8 ani knižnice tretích strán, môžeme k nim ručne spojiť pole prvkov StringBuilder. V tomto prípade je implementácia rovnaká pre oba typy polí:
if (array.length == 0) {return ""; } StringBuilder stringBuilder = nový StringBuilder (); pre (int i = 0; i <pole.length - 1; i ++) {stringBuilder.append (pole [i]); stringBuilder.append (oddeľovač); } stringBuilder.append (pole [pole.length - 1]); Reťazec spojený = stringBuilder.toString ();
8. Záver
Tento rýchly článok ilustruje množstvo spôsobov, ako spojiť pole primitívov s daným oddeľovacím znakom alebo reťazcom. Ukázali sme príklady využívajúce natívne riešenia JDK, ako aj ďalšie riešenia využívajúce dve knižnice tretích strán - Apache Commons Lang a Guava.
Úplný kód použitý v tomto článku je ako vždy k dispozícii na stránkach GitHub.