Javaでプリミティブの配列をセパレータで結合する

JavaのSeparatorでプリミティブの配列を結合する

1. 前書き

このクイックチュートリアルでは、join an array of primitives with a single-character separator in Javaの方法を学習します。 この例では、intの配列とcharの配列の2つの配列を検討します。

2. 問題の定義

まず、例のintの配列とcharの配列、およびそれらのコンテンツを結合するために使用する区切り文字を定義することから始めましょう。

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);

some of the methods we’ll show require a char argument, while others require a String argument以降、charStringの両方の区切り文字が含まれていることに注意してください。

結合操作の結果には、int配列の場合は“1-2-3-4-5-6-7-8-9”が含まれ、char配列の場合は“a-b-c-d-e-f”が含まれます。

3. Collectors.joining()

Java 8 Stream APIで利用可能なメソッドの1つであるCollectors.joining()から始めましょう。

まず、java.utilパッケージにあるArrays.stream()メソッドを使用して、プリミティブの配列からStreamを作成します。 次に、各要素をStringにマップします。 最後に、指定されたセパレータで要素を連結します。

int配列から始めましょう。

String joined = Arrays.stream(intArray)
  .mapToObj(String::valueOf)
  .collect(Collectors.joining(separator));

When joining our char array with this method, we must first wrap the char array into CharBuffer and then project it to char again.これは、chars()メソッドがint値のStreamを返すためです。

残念ながら、Java Stream APIは、charStreamをラップするためのネイティブメソッドを提供していません。

char配列に参加しましょう:

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

4. StringJoiner

Collectors.joining()と同様に、このアプローチはStream APIを利用しますが、要素を収集する代わりに、要素を反復処理してStringJoinerインスタンスに追加します。

StringJoiner intStringJoiner = new StringJoiner(separator);
Arrays.stream(intArray)
  .mapToObj(String::valueOf)
  .forEach(intStringJoiner::add);
String joined = intStringJoiner.toString();

Stream APIを使用する場合のAgain, we have to wrap our char array into CharBuffer

StringJoiner charStringJoiner = new StringJoiner(separator);
CharBuffer.wrap(charArray).chars()
  .mapToObj(intChar -> String.valueOf((char) intChar))
  .forEach(charStringJoiner::add);
String joined = charStringJoiner.toString();

5. アパッチコモンズラング

Apache Commons Langライブラリは、プリミティブ配列を結合するために使用できるStringUtilsクラスとArrayUtilsクラスのいくつかの便利なメソッドを提供します。

このライブラリを使用するには、commons-lang3dependencypom.xmlに追加する必要があります。


    org.apache.commons
    commons-lang3
    3.8.1

Stringセパレーターを使用する場合は、StringUtilsArrayUtilsの両方を使用します。

これらを一緒に使用して、int配列を結合しましょう。

String joined = StringUtils.join(ArrayUtils.toObject(intArray), separator);

または、プリミティブのchar型を区切り文字として使用している場合は、次のように簡単に記述できます。

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

char配列を結合するための実装は非常に似ています。

String joined = StringUtils.join(ArrayUtils.toObject(charArray), separator);

また、charセパレーターを使用する場合:

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

6. グアバ

Google’s Guavaライブラリは、配列を結合するために使用できるJoinerクラスを提供します。 プロジェクトでGuavaを使用するには、the guava Maven dependencyを追加する必要があります。


    com.google.guava
    guava
    27.0.1-jre

Joinerクラスを使用してint配列に参加しましょう。

String joined = Joiner.on(separator).join(Ints.asList(intArray));

この例では、GuavaのInts.asList()メソッドも使用しました。これは、プリミティブの配列をIntegerListに適切に変換します。

Guavaは、char配列をCharacter.Listに変換するための同様の方法を提供します。その結果、char配列の結合は、%を使用した上記の例と非常によく似ています。 (t4)s配列:

String joined = Joiner.on(separator).join(Chars.asList(charArray));

7. StringBuilder

最後に、if we can’t use either Java 8 or third-party libraries, we can manually join an array of elements with StringBuilder。 この場合、実装は両方のタイプの配列で同一です:

if (array.length == 0) {
    return "";
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < array.length - 1; i++) {
    stringBuilder.append(array[i]);
    stringBuilder.append(separator);
}
stringBuilder.append(array[array.length - 1]);
String joined = stringBuilder.toString();

8. 結論

この簡単な記事では、プリミティブの配列を特定の区切り文字または文字列に結合するいくつかの方法を説明します。 ネイティブJDKソリューションを使用した例と、2つのサードパーティライブラリ(Apache Commons LangおよびGuava)を使用した追加ソリューションを示しました。

いつものように、この記事で使用されている完全なコードはover on GitHubで利用できます。