Java | レベル別練習問題:配列のコピー

Java Java
スポンサーリンク

では、先ほどの レベル別練習問題 に対応する 解答例と解説 をまとめます。初心者が理解しやすいように、コードと出力結果をセットで示します。

初級(基本)

問題1: コピーと代入の違い

import java.util.Arrays;

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

        int[] b = a; // 代入(同じ配列を参照)
        int[] c = Arrays.copyOf(a, a.length); // コピー(新しい配列)

        b[0] = 99; // bを変更
        c[1] = 88; // cを変更

        System.out.println(Arrays.toString(a)); // [99, 2, 3] ← bの変更が反映
        System.out.println(Arrays.toString(b)); // [99, 2, 3]
        System.out.println(Arrays.toString(c)); // [1, 88, 3] ← 独立している
    }
}
Java

解説:

  • b = a; は「同じ住所を渡す」だけ。変更が共有される。
  • Arrays.copyOf は「新しい家を建てて中身をコピー」。独立している。

問題2: 部分コピー

import java.util.Arrays;

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

        System.arraycopy(nums, 1, part, 0, 3);

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

解説:

  • System.arraycopy(元, 元開始位置, 先, 先開始位置, 要素数)
  • 今回は nums[1] から3つコピー → [20,30,40]

中級(応用)

問題1: 配列の拡張

import java.util.Arrays;

public class CopyExpand {
    public static void main(String[] args) {
        int[] a = {1, 2, 3};
        int[] expanded = Arrays.copyOf(a, 5);

        System.out.println(Arrays.toString(expanded)); // [1, 2, 3, 0, 0]
    }
}
Java

解説:

  • 長さを増やすと、足りない部分は 0 で埋まる。

問題2: コピーしてソート

import java.util.Arrays;

public class CopySort {
    public static void main(String[] args) {
        int[] data = {5, 3, 9, 1};
        int[] sorted = Arrays.copyOf(data, data.length);

        Arrays.sort(sorted);

        System.out.println(Arrays.toString(data));   // [5, 3, 9, 1]
        System.out.println(Arrays.toString(sorted)); // [1, 3, 5, 9]
    }
}
Java

解説:

  • コピー先だけソートすれば、元の配列はそのまま。

問題3: 文字列配列のコピー

import java.util.Arrays;

public class CopyString {
    public static void main(String[] args) {
        String[] words = {"apple", "banana", "cherry"};
        String[] copy = Arrays.copyOf(words, words.length);

        copy[1] = "orange";

        System.out.println(Arrays.toString(words)); // [apple, banana, cherry]
        System.out.println(Arrays.toString(copy));  // [apple, orange, cherry]
    }
}
Java

解説:

  • String は不変(immutable)なので、コピー先を変更しても元には影響なし。

上級(オブジェクト)

問題1: 浅いコピー

class Book {
    String title;
    Book(String title) { this.title = title; }
}

public class ShallowCopy {
    public static void main(String[] args) {
        Book[] src = { new Book("Java入門"), new Book("C入門") };
        Book[] shallow = java.util.Arrays.copyOf(src, src.length);

        shallow[0].title = "Python入門";

        System.out.println(src[0].title);     // Python入門(影響あり)
        System.out.println(shallow[0].title); // Python入門
    }
}
Java

解説:

  • 配列は新しくなるが、中の Book オブジェクトは同じものを参照。

問題2: 深いコピー

class Book {
    String title;
    Book(String title) { this.title = title; }
}

public class DeepCopy {
    public static void main(String[] args) {
        Book[] src = { new Book("Java入門"), new Book("C入門") };
        Book[] deep = new Book[src.length];

        for (int i = 0; i < src.length; i++) {
            deep[i] = new Book(src[i].title); // 新しいBookを作る
        }

        deep[0].title = "Python入門";

        System.out.println(src[0].title);  // Java入門(影響なし)
        System.out.println(deep[0].title); // Python入門
    }
}
Java

解説:

  • 新しいオブジェクトを作ることで、完全に独立したコピーになる。

問題3: Studentクラス(scoresもコピー)

import java.util.Arrays;

class Student {
    String name;
    int[] scores;
    Student(String name, int[] scores) {
        this.name = name;
        this.scores = scores;
    }
}

public class DeepCopyStudent {
    public static void main(String[] args) {
        Student[] src = {
            new Student("Alice", new int[]{90, 80}),
            new Student("Bob", new int[]{70, 60})
        };

        // 深いコピー
        Student[] deep = new Student[src.length];
        for (int i = 0; i < src.length; i++) {
            deep[i] = new Student(src[i].name, Arrays.copyOf(src[i].scores, src[i].scores.length));
        }

        deep[0].scores[0] = 100;

        System.out.println(Arrays.toString(src[0].scores)); // [90, 80](影響なし)
        System.out.println(Arrays.toString(deep[0].scores)); // [100, 80]
    }
}
Java

解説:

  • scores も新しくコピーしないと、浅いコピーでは共有されてしまう。
  • Arrays.copyOf を使って中の配列も独立させる。

✅ まとめ

  • 初級: コピーと代入の違いを理解。
  • 中級: 実用的なコピー(拡張・ソート・文字列)。
  • 上級: オブジェクト配列で浅いコピー/深いコピーを体験。

👉 次のステップとしては「自分でクラスを作ってコピー方法を考える」練習がおすすめです。
例えば「図書館の本リスト」「ゲームのキャラクター配列」などを題材にすると楽しく学べます。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました