制御構造については下記のページで解説しましたが、ここでは、制御構造の応用的な使い方を取り上げます。
ですので事前に確認しておいて下さい。
具体的には次の3つです。
- 二重ループ
- 制御の中断
- 制御の継続
二重ループ
二重ループとは、for文の中にさらにfor文があるような「入れ子」になった繰り返し制御のことです。
(入れ子のことを「ネスト」と表現する場合もあります)
二重ループにすることで外側の繰り返し処理が行われる度に、内側の繰り返し処理が実行されます。
多重配列の全要素にアクセスするループ文を書く際には、この二重ループなどが利用されます。
for文を用いた二重ループは次のように書くことができます。さらに、下の図で動作のイメージも確認しておきましょう。
フローチャートは以下の通りです。
二重ループ
public class DoubleLoop{ public static void main(String[ ] args){ for(int i = 1; i <= 3; i++){ System.out.println("外側のループ処理のはじめ:" + i + "回目"); for(int j = 1; j <= 2; j++) { System.out.println("\t内側のループ:" + j + "回目"); } System.out.println("外側のループ処理の終わり"); } } }
実行結果
外側のループ処理のはじめ:1回目 内側のループ:1回目 内側のループ:2回目 外側のループ処理の終わり 外側のループ処理のはじめ:2回目 内側のループ:1回目 内側のループ:2回目 外側のループ処理の終わり 外側のループ処理のはじめ:2回目 内側のループ:1回目 内側のループ:2回目 外側のループ処理の終わり
ポイントは、外側のfor文によるループが1回行われるたびに、内側のfor文ループでは初期化処理が行われる点です。
4行目の処理の後、5行目にプログラムが移るときに、初期化の処理が行われ、カウンタjの値が1になります。
このような二重ループは、二次元配列の値を初期化したり、表示するときなどによく利用されます。
制御の中断と継続
二重ループを何らかの条件が成り立った時に中断したり、ループの先頭に戻したりという事が出来ます。
この際に用いるのが、「break文」と「continue文」です。この制御の中断と継続はループの中で使います。
各々の違いは以下の通りです。
- break文 : ループを中断
- continue文 : ループの先頭へ戻る
ポイント1 : break文とswitch文
break文の場合は条件分岐のswitch文でも登場しました。これは中括弧”{…}”で囲まれた処理を中断する点で共通しています。
ポイント2 : break文で中断するブロック
break文でswitch文やループ(for文、while文)のループを中断することができます。ただし、if文のブロックは中断することはできませんので注意してください。
break 文
public class Break{ public static void main(String[ ] args){ System.out.println("Start..."); for(int i = 0; i < 3; i++){ System.out.println("i : " + i ); if(i == 1){ //iが1の時にループを中断する break; } System.out.println("ループの中身の処理"); } System.out.println("終了"); } }
実行結果
Start... i : 0 ループの中身の処理 i : 1 終了
プログラムの7〜9行目を見てください。
これはカウンタiの値が1の時、ループを中断するというものです。
本来はfor文によってiが2まで処理されるはずですが、iが1の時にbreak文が処理されるため、for文がその時点で中断されます。
if文が中断するのではなく、ループが中断している点に注意してください。
continue文
public class Continue{ public static void main(String[ ] args){ for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ System.out.println("\ti : " + i + ", j : " + j); if(j == 1){ continue; //continue文を利用して内側のループに戻る } System.out.println("\t\t内側のループの処理"); } System.out.println("外側のループの処理"); } System.out.println("終了"); } }
実行結果
i : 0, j : 0 内側のループの処理 i : 0, j : 1 i : 0, j : 2 内側のループの処理 外側のループの処理 i : 1, j : 0 内側のループの処理 i : 1, j : 1 i : 1, j : 2 内側のループの処理 外側のループの処理 i : 2, j : 0 内側のループの処理 i : 2, j : 1 i : 2, j : 2 内側のループの処理 外側のループの処理 終了
continue文が処理されると、内側のループ、もしくはラベル付けされたループの先頭に戻ります。
今回は、7行目のcontinueの次には4行目のfor文の条件判断が行われることになります。
今回はラベルを利用していないので、continue文では内側のループの先頭に戻ります。
まとめ
二重ループ ループの中にループを記述することを、多重ループや、入れ子、ネストなどと呼びます。これらは多次元配列などと組み合わせる形で利用されることが多いです。
制御の中断 ループ処理を中断したい場合はbreak文を使います。
制御の継続 ループ中の処理を戻したい場合はcontinue文を使います。breakとは異なり、ループ自体は継続されます。
参考図書
独学で挫折しそうになったら、オンラインプログラミングスクール