Java | コピーを使った Undo 機能

Java Java
スポンサーリンク

では「Undo機能をもっと本格的に作る」例を、初心者でも理解できるように段階的に紹介します。ここでは 配列のコピーを履歴として保存し、複数回のUndoができる仕組み を作ります。


基本アイデア

  • 状態(配列)を変更する前にコピーして履歴に保存
  • Undoすると履歴から1つ前の状態を復元
  • 履歴をリスト(ArrayList)で管理すれば、何回でも戻れる。

コード例:複数回Undoできる配列操作

import java.util.*;

public class UndoExample {
    public static void main(String[] args) {
        // 現在の状態
        int[] state = {1, 2, 3};

        // 履歴を保存するリスト
        List<int[]> history = new ArrayList<>();

        // 初期状態を保存
        history.add(Arrays.copyOf(state, state.length));

        // ---- 状態を変更していく ----
        state[0] = 99;
        history.add(Arrays.copyOf(state, state.length)); // 保存

        state[1] = 77;
        history.add(Arrays.copyOf(state, state.length)); // 保存

        state[2] = 55;
        history.add(Arrays.copyOf(state, state.length)); // 保存

        System.out.println("現在の状態: " + Arrays.toString(state));
        // [99, 77, 55]

        // ---- Undo機能 ----
        // 履歴から1つ前を取り出して復元
        state = Arrays.copyOf(history.get(history.size() - 2), state.length);
        history.remove(history.size() - 1); // 最新を削除

        System.out.println("Undo後の状態: " + Arrays.toString(state));
        // [99, 77, 3]

        // さらにUndo
        state = Arrays.copyOf(history.get(history.size() - 2), state.length);
        history.remove(history.size() - 1);

        System.out.println("さらにUndo後の状態: " + Arrays.toString(state));
        // [99, 2, 3]
    }
}
Java

解説

  1. 履歴リストにコピーを保存
    • Arrays.copyOf を使って「独立した配列」を履歴に追加。
    • これで「過去の状態」を保持できる。
  2. Undo処理
    • 履歴の最後から1つ前を取り出して復元。
    • 最新の履歴は削除して「戻った」ことを表現。
  3. 複数回Undo
    • 履歴を繰り返し使えば、何段階でも戻れる。

応用ポイント

  • Redo機能も作れる
    • Undoで消した履歴を「別のリスト」に保存しておけば、Redo(やり直し)が可能。
  • オブジェクト配列でも可能
    • 浅いコピーだと履歴が共有されてしまうので、深いコピーを実装する必要あり。
  • ゲームやエディタで活用
    • 盤面やテキストの状態を履歴に保存 → Undo/Redoが実現できる。

✅ まとめ

  • Undo機能は「状態のコピーを履歴に保存」することで実現できる。
  • Arrays.copyOf を使えば簡単に「独立したスナップショット」が作れる。
  • 履歴をリストで管理すれば、複数回UndoやRedoも可能。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました