Java の for 文による繰り返し
Java の for 文とは
while と同じく繰り返し処理を行うために for 文というのもあります。for 文による繰り返し処理を for ループなどといいます。
for 文では変数の初期化、条件式、変数の変更 (インクリメント、デクリメントなど) をまとめて記述できます。
for ( 変数の初期化; 条件式; 変数の変更 ) {
// 条件式が真 (true) のときに実行されるコード
}
ループ処理を行う場合には、終了条件に正しく到達しないと永久にループを繰り返してしまいます。 このために、変数の初期化および条件式に関わる変数の値の変更は非常に重要です。
このため、上記の while 文の例のように単純に変数 i を繰り返し回数を数えるだけの目的で使用する場合 (この場合は i はカウンターであるなどといいます) は、for 文の利用を検討すると良いです。
while 文での実行例を、for を使って書き換えると次のようになります。
public class TestApp {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.println(i);
}
}
}
実行例は次のとおりです。
0
1
2
Java の for-each 文
コレクションまたは配列内の要素に対して、何かの処理を行う場合は拡張された for 文として、 for-each 文と呼ばれる形式を利用できます。
for ( データ型 変数1 : コレクションまたは配列 ) {
// コレクションまたは配列内のそれぞれの要素毎に
// 変数1 が利用でき、全ての要素に対して処理が繰り返される
}
コード例は次のとおりです。
public class TestApp {
public static void main(String[] args) {
int[] a = {1, 2, 3};
for (int i : a) {
System.out.println(i);
}
}
}
実行例は次のとおりです。
1
2
3
continue 文による処理の継続と中断
上記繰り返し処理では、いずれも繰り返し処理を中断する場合は、繰り返しを指定するコードブロック内で break 文を呼ぶことで、 ループから抜けることができます。
また、処理を途中でスキップするとき等は continue を利用できます。
continue を利用した例として、次のコードを見てください。
public class TestApp {
public static void main(String[] args) {
int[] a = {10, 20, 150, 300};
for (int i : a) {
if (i < 100) {
continue;
}
System.out.println(i);
}
}
}
実行結果は次のとおりです。
150
300
上のコードでは a という int の配列を用意しています。要素は 10, 20, 150, 300 です。
a に対して for-each ループを用いて、a 内のそれぞれの要素に対する処理を行っています。 ここでは、要素の値を System.out.println で出力しています。
しかしながら、要素が 100 より小さい場合は出力したくないとします。 この場合、ループは継続したいけれど、その後の処理(ここでは println を呼ぶこと)をしないで、 次のループに処理を移すために、continue を利用できるのです。
break 文によるループの中断
ループ処理を行っているとき、なんらかの条件でループ処理を中断するには break 文が利用できます。
上で説明した continue 文は、ループのその回だけ処理を中断して、次のループに行くのに対して、break 文ではループそのものを中断します。
例えば、次の例では、配列 a のそれぞれの要素に対して for ループを行っています。 もし要素の値が 100 より大きいものが出現したら、ループを中断しています。
public class TestApp {
public static void main(String[] args) {
int[] a = {10, 20, 150, 300};
for (int i : a) {
if (i > 100) {
break;
}
System.out.println(i);
}
}
}
この実行結果は次のようになります。
10
20
多重ループの内ループで外ループも含めて中断する
もし多重ループを break 文で中断する場合には、どうしたらよいでしょうか。
内側のループ内で break 文をかいても、そのままでは内側のループが中断されるだけで、外側のループは継続したままになります。
内側のループ内で break して、外側のループも中断するためには、次のように break に続いてラベルを設定します。ラベルは外側のループに設定しておきます。ラベルは任意の文字です。
loop1: // ラベル loop1
for (...) {
for (...) {
break loop1; // break に続き外のループのラベルを指定
}
}
実際に実行できる形でサンプルコードを書いてみます。
public class TestApp {
public static void main(String[] args) {
loop1:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (j > 5) {
break loop1;
}
System.out.printf("(%d %d)", i, j);
}
System.out.println();
}
}
}
この実行結果は次の通りです。
(0 0)(0 1)(0 2)(0 3)(0 4)(0 5)
確かに 内側のループで break して、外のループも終了しています。