java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

2つの配列を結合する方法

投稿日:

最終更新日:2023年01月03日

アイキャッチ

こんにちは。今回は配列を結合する方法について書きました。

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では配列の結合を直接できるメソッドはないようです。

以上、参考になれば幸いです。