Java | 配列の連結

Java Java
スポンサーリンク

配列の連結をやさしく理解する

「配列をつなげる」って、要素が入った箱を2つ並べて、1つの長い箱にまとめるイメージです。Javaでは配列同士を直接「プラス」で足すことはできないので、「新しい箱を作って、中身をコピーする」方法で連結します。


基本の考え方

  • 配列はサイズが固定: 作った後で大きさを変えられません。だから2つをつなげたいときは、合計サイズの新しい配列を作ります。
  • コピーして詰める: 最初の配列の中身を前半に、次の配列の中身を後半にコピーします。
  • 便利メソッドを使う: System.arraycopy を使うと、早くて安全にコピーできます。

配列連結の定番手順

  1. 新しい配列を作る
    • 長さは「配列Aの長さ + 配列Bの長さ」。
  2. 前半をコピー
    • 新しい配列の先頭に、配列Aの中身をコピー。
  3. 後半をコピー
    • 配列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」という位置指定が連結のキモ。

よくあるつまずきと対策

  • 長さの計算ミス: 新しい配列のサイズは「合計」。片方の長さを忘れると後半が入りません。
  • 開始位置のズレ: 後半は「前半の長さからスタート」。destPosfirst.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。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました