こんにちは。今回は配列を結合する方法について書きました。
Stream APIを使わない場合は、以前の記事「配列の末尾に追加する」に書きました。
※上記の記事ではSystemクラスのarraycopy()メソッドを使った方法を書きました。
ここで紹介する方法はStream APIを使う方法です。
Stream APIのconcat()を応用して、配列を結合する
今回はint型配列を結合する例を挙げました。プリミティブ型〇〇〇には〇〇〇Streamという名称のクラスが使えます。また、オブジェクトの配列に対しては、Streamクラスが使えます。
メソッドを自作
IntStreamなどのクラスではconcat()メソッドが用意されています。
今回は、int型配列を結合する処理をconcat()メソッドを使って、実装しました。
※static IntStream concat(IntStream a, IntStream b)
以下が実際に作ったプログラムです。
配列を結合するためのクラス
import java.util.stream.IntStream;
public class ConcatUtil {
public static int[] concatArrays(int a[], int b[]) {
// ストリームに返還
IntStream a_stream = IntStream.of(a);
IntStream b_stream = IntStream.of(b);
// 結合
IntStream c_stream = IntStream.concat(a_stream, b_stream);
// 配列に変換
int[] c = c_stream.toArray();
return c;
}
}
上記のconcatArrays()では、引数で配列aと配列bを受け取ります。
最初にそれぞれをIntStreamに変換しています。IntStreamクラスのofメソッドではint型の複数の値を受け取り、IntStreamを返却します。
※static IntStream of(int… values)
IntStreamクラスのconcat()メソッドでは2つのIntStreamを受け取り、結合したIntStreamを返却します。
※static IntStream concat(IntStream a, IntStream b)
なお、APIドキュメントによると、このメソッドは「結果のストリームが順序付けされるのは、入力ストリームがどちらも順序付けされている場合」とあるので、注意が必要です。
最後にIntStreamクラスのtoArray()メソッドで配列に変換しています。
※int[] toArray()
上記の処理で、2つの配列を1つの配列に結合するメソッドが作れました。
以下は上記プログラムのテストです。
配列の結合のテスト
import java.util.Arrays;
public class SampleTest {
public static void main(String[] args) {
int[] a = {1, 2, 3};
int[] b = {11,12,13};
int[] c = ConcatUtil.concatArrays(a, b);
System.out.println(Arrays.toString(c));
}
}
最初に配列aと配列bを定義しています。なお、中括弧で配列の初期値を書き並べる方法があります。参考:「配列の初期化の方法をまとめました」。
次に、今回作ったサンプルプログラムのconcatArrays()メソッドを呼び出しています。
最後に配列の内容を出力しています。ArraysクラスのtoString()メソッドは指定された配列の文字列表現が取得できます。それを出力しています。
※public static String toString(int[] a)
結果
[1, 2, 3, 11, 12, 13]
出力結果を見ると、配列aと配列bが結合できたのが確認できました。
メソッドチェーンで記述する
Stream APIではメソッドチェーンの記述が出来ることが多いです。
以下では、メソッドチェーンを使って、単一文で配列の結合を記述しました。
メソッドチェーンで記述
import java.util.Arrays;
import java.util.stream.IntStream;
public class MoreSimple {
public static void main(String[] args) {
System.out.println("メソッドチェーンで記述");
int[] a = {1, 2, 3};
int[] b = {11,12,13};
int[] c = IntStream
.concat(IntStream.of(a), IntStream.of(b))
.toArray();
System.out.println(Arrays.toString(c));
}
}
結果
メソッドチェーンで記述
[1, 2, 3, 11, 12, 13]
このように、concat()メソッドの結果に対して、toArray()メソッドを呼び出すことができます。
String型の配列の結合
最後に、オブジェクト型の配列の結合の例として、String型のサンプルを書きました。
String型の配列の結合
import java.util.Arrays;
import java.util.stream.Stream;
public class StringExample {
public static void main(String[] args) {
System.out.println("String型の例");
String[] a = {"a001", "b001"};
String[] b = {"a002", "b002"};
String[] c = Stream
.concat(Stream.of(a), Stream.of(b))
.toArray(String[]::new);
System.out.println(Arrays.toString(c));
}
}
結果
String型の例
[a001, b001, a002, b002]
このように、toArray()メソッドの引数に「String[]::new」という指定が必要です。
以上のように、Stream APIのconcat()メソッドを応用することで、配列を結合することが出来ます。
※Javaでは配列の結合を直接できるメソッドはないようです。
以上、参考になれば幸いです。