繰り返しについて

この節の要点

  • よく使う繰り返し文としてfor文とwhile文がある。

繰り返しとは、特定の処理を決められた回数繰り返す制御のことです。

これら繰り返しは、配列のような連続したデータ構造を処理するために使われることが多いです。

Javaの繰り返しは、while、do-while、forの3つがあります。ここでは、do-while文は省略し、while文とfor文について、説明します。

while文

while文は、丸括弧で指定された条件式が真であるかぎり、繰り返す構文です。条件式はif文の時と同様に、ブール値を返却する内容であれば何でも良いです。 while文は、繰り返す前に、条件式が成り立っているか判断します。繰り返す以前に条件式が成り立っていなければ、while文はスキップされ、繰り返し処理を実行しません。 図61にプログラム例を示します。このようなループ回数が定まっていない処理をする際にwhile文が利用されます。

int collatz = 50;

while (collatz != 1) {

	if (collatz % 2 == 0) {
		collatz = collatz / 2;
	} else {
		collatz = (collatz * 3) + 1
	}

	System.out.println(collatz);
}
図61:while文の例

なお、while文を利用することで、無限ループを実現できます。図62に無限ループの例を示します。

Scanner scan = new Scanner(System.in);

while (true) {
	String s = scan.nextLine();
	
	if (s.length() > 5) {
		break;
	}

	System.out.println(s);
}
図62:無限ループの例

図62では break文 を使っています。break文は実行中の繰り返しを終了する文です。このプログラムの場合、入力された文字列の長さが6以上だった場合、ループを終了します。それ以外の長さの文字列があった場合、ループを継続します。

また、Cなどと同様に continue文もあります。continue文は繰り返し処理を中断する文です。中断した後、それ以降の繰り返し処理は行わず、先頭の条件式評価からやりなおします。

for文

for文は、for (初期化; 条件式; ループ後処理)で定義される、繰り返し文です。for文開始時に、初期化がなされ、ついで条件式が評価され真であれば、繰り返し処理を実施します。繰り返し処理が終わるたびにループ後処理を実行して、再び条件式が評価され真であれば、繰り返し処理を繰り返す文です。

一般的にループ回数の上限が定まっているため、不用意なループを繰り返すことが少なく、意図したプログラムを作成しやすいため、なるべくfor文を利用した繰り返しをすべきです。 for文の利用例を図63に示します。

int[] nums = new int[5];
nums[0] = 10;
nums[1] = 5;
nums[2] = 6;
nums[3] = -5;

int sum = 0;
for (int i = 0; i < nums.length; i++) {
	sum = sum + nums[i];
}

System.out.println("array sum: " + sum);
図63:for文の例

また、Javaではfor文の配列オブジェクトやリストオブジェクトなど、連続したデータを扱うための特殊な記法があります。これを拡張for文と呼びます。 図64に拡張for文を使った繰り返し例を示します。

int[] nums = new int[5];
nums[0] = 10;
nums[1] = 5;
nums[2] = 6;
nums[3] = -5;

int sum = 0;
for (int x: nums) {
	sum = sum + x;
}

System.out.println("array sum: " + sum);
図64:拡張for文の例

図64のプログラムの処理内容は、図63の内容と変わりません。唯一違う内容としては、for文の定義の箇所です。拡張for文では、初期化、条件式およびループ後処理がありません。その代わりfor (一時変数: 走査する配列)のような定義となっています。このfor文では、走査する配列に与えられた配列やリストに対して、先頭インデックスのデータから順に、ループごとに一時変数へ代入します。そして繰り返し処理を実施します。繰り返し処理終了後、一時変数へ代入されているデータを配列インデックスをずらして、代入しなおし、再び繰り返し処理を行います。この処理を全ての配列内のデータに対して行うまで(走査しきるまで)繰り返し処理を行います。

このように拡張for文は、配列内の全データあるいはリスト内の全データについて、繰り返し処理を行う際に、for文よりも簡潔に記述できます。