| English | 意味 |
|---|---|
| nested loops/ˈnestɪd luːps/ | ネストループ |
| row-major order/rəʊ ˈmeɪdʒə ˈɔːdə/ | 行主順 |
| enhanced for/enˈhænst fɔː/ | 強化for文 |
長方形グリッドは誤ったループ境界を露出させる
- グリッドには2行3列があります。両方のインデックスに対してg.lengthで境界を設定するとループは最初の2列しか訪問しません。
- r < g.length と使用し、各行に対して c < g[r].length とします。これにより異なる長さの行も処理でき、g[0].length は非空の長方形グリッドを前提としています。
グリッドのためのネストループ
- 2-D配列のすべてのセルを訪問するには、ネストループ(Unit 2より)を使用します。外側ループで行、内側ループで列を反復します:
for (int r = 0; r < g.length; r++) { for (int c = 0; c < g[r].length; c++) { ... g[r][c] ... } }内側ループは外側ループが次の行に進む前に、完全な行をスキャンします。
行優先順 (Row-major order)
- このネストは行優先順でセルを訪問します:行0のすべて、次に行1、…
g[0][0], g[0][1], …, g[1][0], g[1][1], … - これは自然な読書順序であり、左から右、上から下です。非空の長方形グリッドの場合、列を外側ループにしてセルを列ごとに訪問することもできます。ラゲッド配列の場合、ある行に存在しない列に対する明示的なポリシーが必要です。
for-eachバージョン
- 2-D配列に対する強化forループは、一度に**1つの行(1-D配列)**を与えます。
for (int[] row : g) { for (int x : row) { ... x ... } } - 外側の変数は完全な行であり、内側ループはその行の値を.walkします。基本型ループ変数は再割り当て時に格納されたセルを更新しません。行変数はまだ参照であるため、インデックス付き内側ループで
row[c]を修改できます。
行優先順の反復
外側ループで行、内側ループで列:1,2,3,4,5,6。
ここで示されたどのパターンが、行参照がすべて非nullな非nullの 2 次元 int 配列のすべてのセルを訪問しますか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
外側は行、内側は列。
示された行主順 2-D 走査の外側ループの上限値は...です。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
外側の行ループには g.length を使用し、内側のセルループには g[r].length を使用するため、不等な行長に対応できる。
2行3列のグリッドにおいて、ネストループはどの数のセルを訪問しますか?
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
行数 × 列数 = 2 × 3 = 6。
行優先順の反復は以下の順序でセルを訪問します...
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
行優先順 = 左から右、上から下。
for (int[] row : g)において、変数rowは...
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
外側のfor-each変数は行配列です。
両方のループ境界に g.length を使用する場合は、非正方形の長方形グリッドに対して常に例外が発生する。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
誤り:2 行、3 列のグリッドでは2つの列のみを訪問し、セルを無視する。縦長のグリッドでは、代わりに行境界を超えて実行される可能性がある。
境界値の正しい設定
- 外側の境界:
r < g.length(行)。内側の境界:c < g[r].length(現在の行の長さ)。ループに誤った長さを使用することは、非正方形グリッドにおける微妙なバグです。 - 非空の長方形グリッドの場合、
g[0].lengthは共通の列数をも与え、内側の本体はrows × columns回実行されます。ラゲッド行の場合、行の長さを追加する必要があります。すべての行参照はnullではありません。
行のインデックスに g.length を、その行のセルのインデックスに g[r].length を使用します。 行数を上限として使うと、広いグリッドでは列をスキップしたり、高いグリッドでは配列の bounds を超えたりする可能性があります。空の外部配列は g[0] のアクセスを必要としません;null 行の場合、長さを読み取る前に明示的な処理方針を定める必要があります。
Order the cells visited in row-major traversal of a 2×2 grid.
難易度 3/5 · 200 コイン + 今日初回完了時に小ボーナス付与
The inner loop finishes one row before the outer loop advances.
int[][] g = {{1, 2, 3}, {}, {4}} において、行ごとの巡回では何個のセルを訪問しますか?
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
行の長さの合計:3 + 0 + 1 = 4。空の行はセルを贡献しない。
2次元配列の合計計算:
for (int r = 0; r < g.length; r++)for (int c = 0; c < g[r].length; c++)sum += g[r][c];— null 行がないことを前提に、行ごとにすべてのセルを順次访问します。
の推論を新しいケースへ適用せよ
int[][] g = {{1, 2, 3}, {}, {4}};の場合、各行の長さは 3、0、1 です。行ごとの bounds で访问されるセルは4つあり、合計は 10 になります。g[0].lengthは各行に対して有効な bounds ではありません。- 内側ループでインデックス指定して row[c] を変更できますが、enhanced for ループ内で primitive 型変数 x に再割り当てしても、セルの内容は更新されません。
2 次元配列をネストループで遍历します:外側ループは行(r < g.length)、内側ループは列(c < g[r].length)に対応し、g[r][c] にアクセスします。これは行主順序でセルを访问し、行長の総和(直方グリッドの場合は rows × columns)となります。enhanced for(for (int[] row : g))は一度に1つの行への参照を渡しますが、内側ループの primitive 型変数に代入しても格納されたセルは変わりません。