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 引数を必要とするものもあるので、 char String の両方の分離文字を含めることに注意してください。

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

3. Collectors.joining()

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

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

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

String joined = Arrays.stream(intArray)
  .mapToObj(String::valueOf)
  .collect(Collectors.joining(separator));
  • このメソッドで char 配列を結合するときは、最初に char 配列を CharBuffer にラップしてから char に再度投影する必要があります。

  • 残念ながら、Java Stream APIは Stream of 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 クラスの便利なメソッドがいくつか用意されており、これらを使用してプリミティブ配列に参加できます。

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

String セパレータを使用するときは、 StringUtils ArrayUtils の両方を使用します。

これらを一緒に使用して、 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を使用するには、https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.google.guava%22%20AND%20a%3A%を追加する必要があります。 22guava%22[ guava Mavenの依存関係]:

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

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

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

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

Guavaは、 char 配列を List から Character. に変換するための同様の方法を提供します。その結果、 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を使用した追加のソリューションを示しました。

いつものように、この記事で使われている完全なコードはhttps://github.com/eugenp/tutorials/tree/master/java-strings[over on GitHub]にあります。