1. 序章

このクイックチュートリアルでは、Javaで1文字の区切り文字を使用してプリミティブの配列を結合する方法を学習します。 この例では、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);

いくつかのメソッドはchar引数を必要とし、他のメソッドはString引数を必要とするため、charStringセパレーターの両方が含まれていることに注意してください

結合操作の結果には、 int 配列の「1-2-3-4-5-6-7-8-9」、および「abcdef」が含まれます。 charアレイの場合は「」。

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

char配列をこのメソッドと結合するときは、最初にchar配列をCharBufferにラップしてから、もう一度charに射影する必要があります。これは、 chars()メソッドが[X194X 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を使用する場合は、char配列を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

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

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

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

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のGuavaライブラリは、配列を結合するために使用できるJoinerクラスを提供します。 プロジェクトでGuavaを使用するには、guavaMaven依存関係を追加する必要があります。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

Joiner クラスを使用して、int配列を結合しましょう。

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

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

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

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

7. StringBuilder

最後に、 Java 8またはサードパーティのライブラリを使用できない場合は、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)を使用した追加のソリューションを示しました。

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