Java | 配列のコピー応用編

Java Java
スポンサーリンク

ここまで「コピーの基本」「浅い/深いコピー」を押さえたので、さらに一歩進んだ 応用編 を紹介します。実際のプログラムで役立つ場面を想定した課題です。


応用編の練習課題

1. 配列の結合(マージ)

  • 課題: 2つの配列 int[] a = {1,2,3}int[] b = {4,5,6} を結合して [1,2,3,4,5,6] を作る。
  • ヒント: System.arraycopy を2回使う。

2. 配列のコピーとフィルタリング

  • 課題: int[] nums = {10, 20, 30, 40, 50} から「30以上の値だけ」を新しい配列にコピーする。
  • ヒント: 一度カウントしてから新しい配列を作り、for文でコピー。

3. 多次元配列のコピー

  • 課題: int[][] matrix = {{1,2},{3,4}} をコピーして、片方だけ変更しても元に影響しないようにする。
  • ヒント: Arrays.copyOf では「外側の配列」しかコピーされない。内側もループでコピーする必要がある。

4. オブジェクト配列のディープコピー(複合オブジェクト)

  • 課題: Student クラス(nameint[] scoresを持つ)を配列にしてコピー。
  • ヒント: new Student(...) を作り直し、scoresArrays.copyOf で複製する。

5. コピーと変更履歴の管理

  • 課題: 配列をコピーして「元の状態」と「変更後の状態」を両方保持し、履歴を表示する。
  • ヒント: コピーを「スナップショット」として保存するイメージ。

解答例(いくつか)

1. 配列の結合

import java.util.Arrays;

public class MergeArrays {
    public static void main(String[] args) {
        int[] a = {1, 2, 3};
        int[] b = {4, 5, 6};
        int[] merged = new int[a.length + b.length];

        System.arraycopy(a, 0, merged, 0, a.length);
        System.arraycopy(b, 0, merged, a.length, b.length);

        System.out.println(Arrays.toString(merged)); // [1, 2, 3, 4, 5, 6]
    }
}
Java

2. フィルタリングコピー

import java.util.Arrays;

public class FilterCopy {
    public static void main(String[] args) {
        int[] nums = {10, 20, 30, 40, 50};

        // まず条件に合う要素数を数える
        int count = 0;
        for (int n : nums) {
            if (n >= 30) count++;
        }

        // 新しい配列を作ってコピー
        int[] filtered = new int[count];
        int idx = 0;
        for (int n : nums) {
            if (n >= 30) {
                filtered[idx++] = n;
            }
        }

        System.out.println(Arrays.toString(filtered)); // [30, 40, 50]
    }
}
Java

3. 多次元配列のコピー

import java.util.Arrays;

public class DeepCopyMatrix {
    public static void main(String[] args) {
        int[][] matrix = {{1, 2}, {3, 4}};

        int[][] copy = new int[matrix.length][];
        for (int i = 0; i < matrix.length; i++) {
            copy[i] = Arrays.copyOf(matrix[i], matrix[i].length);
        }

        copy[0][0] = 99;

        System.out.println(Arrays.deepToString(matrix)); // [[1, 2], [3, 4]]
        System.out.println(Arrays.deepToString(copy));   // [[99, 2], [3, 4]]
    }
}
Java

応用編で学べること

  • 結合: 複数の配列をまとめる方法
  • フィルタリング: 条件に合う要素だけ取り出す
  • 多次元配列: 外側だけでなく内側もコピーする必要がある
  • 複合オブジェクト: ディープコピーの重要性
  • 履歴管理: コピーを「スナップショット」として活用できる

👉 さらに発展させるなら「コピーした配列をリストに変換して扱う」「履歴を複数保存してUndo機能を作る」なども面白いです。

タイトルとURLをコピーしました