では「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解説
- 履歴リストにコピーを保存
Arrays.copyOfを使って「独立した配列」を履歴に追加。- これで「過去の状態」を保持できる。
- Undo処理
- 履歴の最後から1つ前を取り出して復元。
- 最新の履歴は削除して「戻った」ことを表現。
- 複数回Undo
- 履歴を繰り返し使えば、何段階でも戻れる。
応用ポイント
- Redo機能も作れる
- Undoで消した履歴を「別のリスト」に保存しておけば、Redo(やり直し)が可能。
- オブジェクト配列でも可能
- 浅いコピーだと履歴が共有されてしまうので、深いコピーを実装する必要あり。
- ゲームやエディタで活用
- 盤面やテキストの状態を履歴に保存 → Undo/Redoが実現できる。
✅ まとめ
- Undo機能は「状態のコピーを履歴に保存」することで実現できる。
Arrays.copyOfを使えば簡単に「独立したスナップショット」が作れる。- 履歴をリストで管理すれば、複数回UndoやRedoも可能。
