多重ループ

7.5 多重ループ

 ここまでで作成したプログラムは、単純な繰り返しを行うだけでしたが、少し複雑に、「繰り返しの中でさらに繰り返しを行う」こともできます。
 このようなループ処理のネスト構造を、多重ループと言います。
 多重ループは、ネストの深さに応じて、二重ループ、三重ループ、・・・と増やすことが出来ます。
 本節では、この多重ループについて解説を行なっていきます。

7.5.1 多重ループの構造

 多重ループの構造には、
 ・ for文内にfor文を書く
 ・ while文内にwhile文をを書く
 ・ do-while文内にdo-while文を書く
 というふうに、同じ種類のループ文をネストすることもあれば、
 ・ for文内にwhile文を書く
 ・ while文内にfor文を書く
 ・ while文内にdo-while文を書く
 といったように、違う種類のループ文をネストすることもできます。ここでは、for文内にfor文を書いた二重ループについて解説します。
 for文の二重ループの基本構文は下記のようになります。

 このfor文の二重ループの流れは、図 7.5.1のフローチャートで確認して下さい。

図 7.5.1 : 二重ループのフローチャート


 それでは、実際にプログラムを作成して、動きを確認していきましょう。

7.5.2 for文の二重ループの動きを確認するプログラム

 このプログラムでは、for文の処理が1回実行される毎にメッセージを表示します。プログラムを作成して、二重ループの動きを確認しましょう。

① ソース・フォルダー      :myproj_intro/src
② パッケージ          :jp.co.f1.intro.ch7
③ 名前             :NestedLoop
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

➢ NestedLoop.java

package jp.co.f1.intro.ch7;

public class NestedLoop {

	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("内側ループ" + j + "回目");
			}

			System.out.println();

		}

	}

}

実行結果

解説

 今回の記述のなかで、二重ループに当たる部分は、7~17行目です。

外側のループの処理内容

 外側のループの内部処理に、内側のループが含まれています。つまり、内側のfor文は、外側のfor文の内部処理の一部であり、外側の内部処理が1回行われる毎に内側のfor文は繰り返し処理を行います。

図 7.5.2 : NestedLoopの二重ループの外側for文の内部処理


内側のループの処理内容

 11行目で宣言した変数jのスコープは、11~13行目のみです。内側のループを抜ける度に無効となり、外側のループを繰り返す度に初期化しています。

図 7.5.3 : NestedLoopの二重ループの内側for文の内部処理


 外側のループの繰り返し処理が一回行われた時、内側のループがどのような動きをしているかを考えながら、次の表でこのプログラムの処理の流れを追ってみて下さい。


 先ほどの表の「内側のfor文」のカウンタ変数の初期化に注目して下さい。表で順序と書かれた列の○4、○16、○28では、内側のfor文のカウンタ変数が初期化されています。つまり、内側のfor文が最初から実行されているということです。
 内側のループは、外側のループの内部処理が1回行なわれる間に全ての処理を終えています。内側のループ文は、外側のループ文の内部処理とも言えます。そのため、外側のループが処理を繰り返した回数分、内側のループの全体が実行されます。

図 7.5.4 : NestedLoopのfor文の二重ループのフローチャート


7.5.3 九九を表示するプログラム

 二重ループの理解を深めるために、今度は九九(くく)の答えを表示するプログラムを作成してみましょう。

① ソース・フォルダー      :myproj_intro/src
② パッケージ          :jp.co.f1.intro.ch7
③ 名前             :NestedLoopWithKuku
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

➢ NestedLoopWithKuku.java

package jp.co.f1.intro.ch7;

public class NestedLoopWithKuku {

	public static void main(String[] args) {

		for (int dan = 1; dan < 10; dan++) {

			System.out.print(dan + "の段 : ");

			for (int count = 1; count < 10; count++) {
				System.out.print(dan * count + " ");
			}

			System.out.println();

		}
	}

}

実行結果

解説

 二重ループになっているのは、7~17行目です。外側のループは九九の「段」を表し、内側のループは各段の1~9までの「掛ける数」を示しています。それぞれのfor文と、表示される文字列の流れは、次のページの表を参考にして下さい。
   7: for (int dan = 1; dan < 10; dan++) {
   9:   System.out.print(dan + "の段 : ");
   11:   for (int count = 1; count < 10; count++) {
   12:        System.out.print(dan * count + " ");
   13:   }
   15:   System.out.println();
   17: }

外側のループの処理内容

 外側のループは、九九の段数を制御しています。内部の処理で、段数の見出し表示、内側のループ(値の表示)、そして改行を行います。

図 7.5.5 : NestedLoopWithKukuの外側のfor文の内部処理


内側のループの処理内容

 ここでは、外側のループのカウント変数dan(九九の段数)と内側のループのカウント変数count(九九の段数に掛ける数)を掛けて、毎回1つずつ値を表示しています。内側のループを抜けると、九九の段が1つ完成します。

図 7.5.6 : NestedLoopWithKukuの内側のfor文の内部処理


 外側のループの1回目、つまり1の段を全て表示させるのが内側のループの役割です。1の段を全て表示させたということは、内側のループが終了したということであり、次に外側のループの内部処理の2回目(2の段)が始まります。

ポイント

・ 外側のループの中に入った内側のループは、外側のループが1回の処理を行う度に繰り返し処理を行います。


NEXT>> 7.6 break文とcontinue文