配列の連結をやさしく理解する
「配列をつなげる」って、要素が入った箱を2つ並べて、1つの長い箱にまとめるイメージです。Javaでは配列同士を直接「プラス」で足すことはできないので、「新しい箱を作って、中身をコピーする」方法で連結します。
基本の考え方
- 配列はサイズが固定: 作った後で大きさを変えられません。だから2つをつなげたいときは、合計サイズの新しい配列を作ります。
- コピーして詰める: 最初の配列の中身を前半に、次の配列の中身を後半にコピーします。
- 便利メソッドを使う:
System.arraycopyを使うと、早くて安全にコピーできます。
配列連結の定番手順
- 新しい配列を作る
- 長さは「配列Aの長さ + 配列Bの長さ」。
- 前半をコピー
- 新しい配列の先頭に、配列Aの中身をコピー。
- 後半をコピー
- 配列Aの直後から、配列Bの中身をコピー。
例題1:整数の配列を連結する
2つのテストの点数を1つにまとめたいとします。
import java.util.Arrays;
public class ConcatExample1 {
public static void main(String[] args) {
int[] test1 = {70, 85, 90};
int[] test2 = {60, 95};
// 1) 新しい配列を作る(長さは合計)
int[] all = new int[test1.length + test2.length];
// 2) test1 を先頭にコピー
System.arraycopy(test1, 0, all, 0, test1.length);
// 3) test2 を test1 の後にコピー
System.arraycopy(test2, 0, all, test1.length, test2.length);
// 結果の確認
System.out.println(Arrays.toString(all)); // [70, 85, 90, 60, 95]
}
}
Java- ポイント: 2回の
arraycopyで「前半」「後半」を埋めるだけ。destPos(コピー先の開始位置)を後半にずらすのがコツ。
例題2:文字列の配列を連結する
クラスAとクラスBの出席番号一覧をまとめます。
import java.util.Arrays;
public class ConcatExample2 {
public static void main(String[] args) {
String[] classA = {"Sato", "Suzuki"};
String[] classB = {"Tanaka", "Ito", "Kato"};
String[] all = new String[classA.length + classB.length];
System.arraycopy(classA, 0, all, 0, classA.length);
System.arraycopy(classB, 0, all, classA.length, classB.length);
System.out.println(Arrays.toString(all)); // [Sato, Suzuki, Tanaka, Ito, Kato]
}
}
Java- ポイント: 型が同じなら手順は同じ。
int[]でもString[]でもOK。
例題3:ループで連結(仕組みを理解する用)
System.arraycopy を使わず、手でコピーしてみます。仕組み理解に役立ちます。
import java.util.Arrays;
public class ConcatExample3 {
public static void main(String[] args) {
int[] a = {1, 2, 3};
int[] b = {4, 5};
int[] all = new int[a.length + b.length];
// a をコピー
for (int i = 0; i < a.length; i++) {
all[i] = a[i];
}
// b をコピー(開始位置は a.length)
for (int i = 0; i < b.length; i++) {
all[a.length + i] = b[i];
}
System.out.println(Arrays.toString(all)); // [1, 2, 3, 4, 5]
}
}
Java- ポイント: 後半のループで「
a.length + i」という位置指定が連結のキモ。
よくあるつまずきと対策
- 長さの計算ミス: 新しい配列のサイズは「合計」。片方の長さを忘れると後半が入りません。
- 開始位置のズレ: 後半は「前半の長さからスタート」。
destPosをfirst.lengthにするのを忘れない。 - 型が違う:
int[]とString[]は一緒にできません。型は揃える。 nullのままコピー: どちらかがnullだとエラー。コピー前にnullチェックを。
小ワザ:複数配列をまとめるヘルパーを作る
毎回書くのが面倒なら、使い回しできるメソッドを用意します。
import java.util.Arrays;
public class ConcatUtil {
public static int[] concat(int[] a, int[] b) {
if (a == null) a = new int[0];
if (b == null) b = new int[0];
int[] result = new int[a.length + b.length];
System.arraycopy(a, 0, result, 0, a.length);
System.arraycopy(b, 0, result, a.length, b.length);
return result;
}
public static void main(String[] args) {
int[] r = concat(new int[]{1, 2}, new int[]{3, 4, 5});
System.out.println(Arrays.toString(r)); // [1, 2, 3, 4, 5]
}
}
Java- ポイント:
nullを空配列に変換しておくと安全。
さらに一歩:可変サイズが必要なら List を使う
- 配列は固定サイズ。 追加・削除が多いなら
ArrayListが楽です。 - 例: 2つのリストをまとめる。
import java.util.ArrayList;
import java.util.List;
public class ListMergeExample {
public static void main(String[] args) {
List<String> a = new ArrayList<>();
a.add("A");
a.add("B");
List<String> b = new ArrayList<>();
b.add("C");
List<String> all = new ArrayList<>(a);
all.addAll(b);
System.out.println(all); // [A, B, C]
}
}
Java- ポイント:
addAllで一発。サイズを気にしなくていい。
まとめのチェックリスト
- 新しい配列の長さ: 片方 + 片方、忘れない。
- コピー位置: 後半は前半の長さから。
- 型一致: 同じ型の配列だけを連結。
System.arraycopy推奨: 速くて安全。仕組みはループでもOK。
