ここまで「コピーの基本」「浅い/深いコピー」を押さえたので、さらに一歩進んだ 応用編 を紹介します。実際のプログラムで役立つ場面を想定した課題です。
応用編の練習課題
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クラス(nameとint[] scoresを持つ)を配列にしてコピー。 - ヒント:
new Student(...)を作り直し、scoresもArrays.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]
}
}
Java2. フィルタリングコピー
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]
}
}
Java3. 多次元配列のコピー
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機能を作る」なども面白いです。
