ネストされたループは、一つのループのシーケンスを他のループの内部で実行することを可能にします。これは、二次元配列や要素の組み合わせなどの多次元構造を走査する必要がある場合に使用されます。最初のループは外側のループと呼ばれ、その内部にあるループは内側のループと呼ばれます。
行列やグラフなどのネストされた構造を扱う必要性から、ネストされたループが登場しました。Javaを含むプログラミング言語は、配列、グラフ、ネットワークなどの処理タスクをプログラミングするために、このメカニズムをもともとサポートしています。
ネストされたループの使用は、イテレーションの数を考慮しない場合、高い時間的複雑性を引き起こす可能性があります。コードの可読性およびインデックスの誤りの問題がしばしば発生します。間違った使い方は、同じアクションを何度も実行する結果になります。
コード例:
int[][] matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); }
重要な特徴:
breakを使用して両方のループを同時に終了できますか?
通常、break文は内側のループのみを終了します。複数のループから同時に出るためにはラベルを使用します:
outer: for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (条件) break outer; } }
ネストされたループによる無限ループは可能ですか?
はい、いずれかのループの終了条件が正しく実装されていない場合、無限ループになります。特に初期化またはカウンタの増加のエラーが原因でよく発生します。
内側のループから外側のループの変数を変更することはできますか?
はい、技術的には可能ですが、可読性が大きく低下し、エラーを引き起こす可能性があります。これを避け、各ループの作業を明確に分離することをお勧めします。
二次元配列のスキャンを実装しますが、iとjの代わりにあらゆる場所でiが使用されます:
for (int i = 0; i < n; i++) { for (int i = 0; i < m; i++) {...} }
長所:
短所:
異なる変数名を使用します:
for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) {...} }
長所:
短所: