Javaでプリミティブの配列を区切り文字で結合する

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」char配列の場合は「abcdef」が含まれます。

3. Collectors.joining()

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

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

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

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

このメソッドでchar配列を結合するときは、最初にchar配列をCharBufferにラップしてから、もう一度charに投影する必要があります。これは、chars()メソッドがint値のストリームを返すためです。

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

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依存関係をpom.xmlに追加する必要があります。

 org.apache.commons commons-lang3 3.8.1 

で作業する場合文字列の区切り、我々は両方の使用を作ってあげるの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);

また、文字区切り文字を使用する場合:

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

6.グアバ

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

 com.google.guava guava 27.0.1-jre 

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

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

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

Guavaは、char配列を文字リストに変換するための同様の方法を提供しますその結果、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で入手できます。