004-003-009
配列のインデックス操作を理解する
上級
問題説明
配列のインデックス操作:安全な要素アクセス
配列のインデックス操作はデータコレクションを扱う基本です。ゼロベースのインデックスと境界条件を理解することで、最も一般的な実行時エラーの一つであるArrayIndexOutOfBoundsExceptionを防げます。
一緒にインデックス操作を学んでいきましょう!
学習目標
- 配列インデックスの計算と動的アクセスを適用できる
- 式を使ったインデックス指定による要素アクセスを実装できる
- インデックス操作の仕組みとArrayIndexOutOfBoundsExceptionの関係を説明できる
学習ポイント
- ゼロベースインデックス: 最初の要素はインデックス0(1ではない)
- 有効範囲: 0から
length - 1(両端含む) - 最後の要素: 常に
array[array.length - 1] - 境界例外: 無効なインデックスアクセスで実行時エラー
インデックスの基本
| 要素 | アクセス | 5要素配列の場合 |
|---|---|---|
| 最初 | array[0] | インデックス0 |
| 2番目 | array[1] | インデックス1 |
| 中間 | array[length/2] | インデックス2 |
| 最後 | array[length-1] | インデックス4 |
よくある間違い
間違えても大丈夫です。もう一度インデックスの範囲を確認してみてください。
間違い1: オフバイワンエラー
誤ったコード:
int[] arr = {10, 20, 30};
int last = arr[arr.length]; // ArrayIndexOutOfBoundsException!
// arr.lengthは3だが、有効なインデックスは0, 1, 2正しいコード:
int last = arr[arr.length - 1]; // 正解: インデックス2間違い2: 負のインデックス
誤ったコード:
int[] arr = {10, 20, 30};
int val = arr[-1]; // ArrayIndexOutOfBoundsException!
// JavaはPythonのような負のインデックスをサポートしない間違い3: 空配列へのアクセス
誤ったコード:
int[] arr = new int[0]; // 空配列
int first = arr[0]; // ArrayIndexOutOfBoundsException!安全なコード:
if (arr.length > 0) {
int first = arr[0]; // 安全なアクセス
}安全なアクセスパターン
// アクセス前にチェック if (index >= 0 && index < array.length) { value = array[index]; }
// 安全な最初/最後の要素アクセス
int first = array.length > 0 ? array[0] : defaultValue;
int last = array.length > 0 ? array[array.length - 1] : defaultValue;
実務での活用
- ループ反復:
i < array.lengthを条件に使用 - 二分探索: 中点を
(low + high) / 2で計算 - スライディングウィンドウ: 開始と終了インデックスを追跡
- 循環バッファ: 剰余
index % lengthを使用
補足: 特にインデックスがユーザー入力や計算から来る場合は、アクセス前に必ずインデックスを検証してください。
前提知識の詳細説明
この問題を解くために必要な知識を確認しましょう。
基本概念
この問題で扱うプログラミングの基本概念を理解することが、正しい解答への第一歩です。コードの各要素がどのように連携して動作するかを把握しましょう。
実装アプローチ
問題を解くための考え方を段階的に整理します:
- 問題文を読み、入力と出力の関係を理解する
- 必要な変数やデータ構造を特定する
- 処理の流れを組み立てる
- テストケースで動作を確認する
