| English | 意味 |
|---|---|
| traversal/træˈvɜːsl/ | トラバース |
| enhanced for loop/enˈhænst fɔː luːp/ | 強化forループ |
全要素へのアクセス
- 走査とは、通常順に配列の全要素を訪問することです。
- 標準的なインデックス付きループ:
for (int i = 0; i < a.length; i++) { ... a[i] ... } iは0からlength - 1まで進みますので、a[i]は各要素を一度ずつ到達します。- 走査はすべての配列アルゴリズムの基礎です。
フォーエアクループ
- 強化されたforループ (for-each) for は、インデックスを使わずに各値を訪問します:
for (int x : a) { ... x ... }—xは順に各要素の値を取得します。- 位置ではなく値のみが必要な場合に簡潔です。
- しかし、配列を変更したりインデックスを使用したりすることはできません。
インデックス付きループとフォーエアクループ
- 位置
iが必要である場合や、要素を変更する場合にインデックス付きループを使用します。 - 単に各値を読み取るだけならフォーエアクループを使用します。
a[i] = 0;はインデックス付きループが必要です; 値の合計計算にはフォーエアクループが使えます。- どちらも全要素を訪問しますが、タスクに適した方を選んでください。
境界条件再び
- インデックス付きループの条件
i < a.lengthはiを有効な範囲内に保ちます。 i <= a.lengthが1つ大きくなると → ArrayIndexOutOfBoundsException が発生します。- フォーエアクループは境界を逸脱することができず、範囲を自動的に処理してくれます。
- インデックスを手動で書く場合は、境界条件の管理 responsibility があります。
for-eachループは値を読み取りますが、配列に書き戻すことはできません。 for (int x : a) { x = 0; }はローカルコピーであるxのみを変化させ、aには影響しません。配列をゼロで初期化するにはインデックス付きループa[i] = 0;が必要です。for-eachは読み取りに使い、インデックス付きループは修正や位置iが必要な場合に使用します。
配列を合計する2つの方法:
- インデックス付き:
for (int i = 0; i < a.length; i++) { sum += a[i]; } - フォーエアクループ:
for (int x : a) { sum += x; } - どちらも同じ総計を提供し、インデックスが不要な場合はフォーエアクループの方が簡潔です。
走査は全要素を訪問します。インデックス付きループ (for (int i = 0; i < a.length; i++)) は位置 i を提供し、a[i] を変更できます;フォーエアクループ (for (int x : a)) は各値を cleanly 読み取りますが、配列を変更したりインデックスを使用したりすることはできません。インデックスが必要か変更できるかどうかによって選択してください。
配列を走査して合計を求める
i が各インデックスを訪問し、sum に a[i] を蓄積します(ここでは a = {10,20,30})。
インデックス i を使って配列 a を走査するための正しい条件は...
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
有効なインデックスは 0..length-1 なので、i < a.length です。
配列の要素を MODIFY(修正)したい場合、どのループを使うべきですか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
for-each は再代入できません;インデックス付きループで a[i] = ... を使ってください。
for (int x : a) { x = 0; } において、配列 a はゼロで初期化されます。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
x はローカルなコピーなので、配列は変更されません。
for-each ループ for (int x : a) は、次の場合に最適です...
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
for-each はインデックスなしで値をきれいに読み取ります。
配列のすべての要素を訪問することを ___ (1語)と呼びます。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
走査(traversal)とは各要素を訪問することです。