for文の処理を途中で抜ける方法が知りたい
こんにちは!エンジニアの中沢です。Javaにはループ処理で同じ処理を繰り返し行うためのfor文があります。
さらに、for文を簡潔に記述できる拡張for文、Java8のforEachメソッドもあります。
この記事では、Javaの繰り返し処理のfor文の基本的な使い方から、Java8で追加された拡張for文やforEachの使い方など応用的な使い方についても解説していきます。
なお、Javaの記事については、こちらにまとめています。
Javaのfor文とは
for文は同じ処理を指定した回数だけ繰り返し実行する場合に使います。for文は次のように記述します。
for (初期化式; 条件式; 変化式) { // 条件式がtrueのときに繰り返す処理 }
初期化式はfor文の最初に一度だけ実行されます。主にfor文で使用する変数の宣言と初期化に使用します。
条件式はループを開始するたびに評価され、”true”のときに”{}”内のブロックの処理を行います。この条件式でループ処理を行う回数を指定する事ができます。
最後に変化式ですが、これはループ処理が終わるたびに実行される式です。主に条件式で使用している変数の値を増加させるために使用します。
ここでは、for文の基本的な構文を解説しました。次の章からはfor文の具体的な使い方を解説していきます。
for文の使い方
基本的な使い方
for文は同じ処理を繰り返し行うので、Listや配列ですべての要素に対して順番に処理を行うときに使われます。
例えば、Listのすべての要素を順番に表示するときには次のように使用します。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String args[]) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); for (int i = 0; i < list.size(); i++) { System.out.println(i + " : " + list.get(i)); } } }
[実行結果]
0 : a 1 : b 2 : c
このプログラムでは、条件式にListのサイズを指定することでListの要素数だけ処理を繰り返しています。ここでは、for文を使ってListでループ処理を行う方法を簡単に解説しました。
List内のデータをfor文で処理するさらに詳しい使い方は、こちらの記事で解説しているのでぜひ確認してください!
省略形のfor(;;)とは
for文の中の式は省略することができます。for文の外で変数の初期化を行う場合は初期化式を省略できます。
また、for文の中で変数を増減させる場合は変化式を省略できます。
ただし、条件式を省略すると常に”true”となり無限ループになるので注意してください。for文の式の省略を次のプログラムで確認してみましょう。
public class Main { public static void main(String[] args) { String[] strArray = { "s", "a", "m", "u", "r", "a", "i" }; // 省略なし for (int i = 0; i < strArray.length; i++) { System.out.print(strArray[i] + " "); } System.out.println(); // 初期化式を省略 int i = 0; for (; i < strArray.length; i++) { System.out.print(strArray[i] + " "); } System.out.println(); // 初期化式と変化式を省略 i = 0; for (; i < strArray.length;) { System.out.print(strArray[i] + " "); i++; } System.out.println(); // 条件式を省略すると常にtrueになる i = 0; for (;;) { System.out.print(strArray[i] + " "); i++; if (i == strArray.length) { break; } } } }
[実行結果]
s a m u r a i s a m u r a i s a m u r a i s a m u r a i
このプログラムでは、初期化式、条件式、変化式を省略した使い方を解説しています。条件式を省略すると無限ループになるため、breakで処理を抜けています。
プログラムの実行結果から、for文の式を省略しても動作することが確認できました!
2重ループの使い方
ここではfor文の2重ループの使い方を解説します。2重ループは二次元配列のすべての要素を表示したい場合などに使われます。
次のプログラムで確認してみましょう。
public class Main { public static void main(String[] args) { String[][] strArray = { { "s", "a", "m", "u", "r", "a", "i" }, { "S", "A", "M", "U", "R", "A", "I" } }; for (int i = 0; i < 2; i++) { for (int j = 0; j < 7; j++) { System.out.print(strArray[i][j] + " "); } System.out.println(); } } }
[実行結果]
s a m u r a i S A M U R A I
このプログラムでは、2重ループで二次元配列のすべての要素を表示しています。
プログラムの実行結果から、2重ループが正しく使えていることが確認できました!
for文の処理を途中で抜ける方法
for文はループ処理を行っている途中で処理の目的を達成した場合に、ループを抜けて残りの処理を行わずに終わらせることができます。
break文でループを抜ける方法
ここではbreak文でループを抜ける方法を解説します。for文の中でbreak文が実行されると、for文の残りの処理を終了して次の処理に移ります。
break文でループを抜ける方法を次のプログラムで確認してみましょう。
public class Main { public static void main(String[] args) { String[] strArray = { "s", "a", "m", "u", "r", "a", "i" }; String str = "a"; for (int i = 0; i < strArray.length; i++) { if (strArray[i].equals(str)) { System.out.println(str + "のインデックス番号 = " + i); break; } } } }
[実行結果]
aのインデックス番号 = 1
このプログラムでは、文字列の配列から”a”が見つかるまでループ処理をしています。
1番目の”a”が見つかった時点でbreak文を使ってループを抜けているので、配列の中の2番目の”a”のインデックス番号は表示されません。
break文は最も内側の1つのループから抜け出すので、多重ループのときには注意してください。多重ループの外側まで抜ける場合は、ラベル付きbreak文を使います。
ラベル付きbreak文の使い方など、break文について詳しく知りたいときはこちらの記事を確認してください。
無限ループをbreakで抜ける方法
通常はfor文の条件式でループを抜ける条件を指定しますが、ここでは無限ループをbreakで抜ける方法を解説します。
breakでループを抜けるには、if文で条件を指定します。次のプログラムで確認してみましょう。
public class Main { public static void main(String[] args) { String[] strArray = { "s", "a", "m", "u", "r", "a", "i" }; for (int i = 0; true; i++) { System.out.print(strArray[i] + " "); if (i + 1 == strArray.length) { break; } } } }
[実行結果]
s a m u r a i
このプログラムではif文を使ってすべての文字が表示された後に、breakでループを抜けています。
プログラムの実行結果から、breakで正しくループを抜けたことが確認できました!
continue文でループをスキップする方法
for文全体を終わらせるのではなく、現在のループ処理の残りをスキップして次のループ処理を開始したい場合にはcontinue文を使います。
continue文でループをスキップする方法を、次のプログラムで確認してみましょう。
public class Main { public static void main(String[] args) { String[] strArray = { "s", "a", "m", "u", "r", "a", "i" }; String str = "a"; for (int i = 0; i < strArray.length; i++) { if (strArray[i].equals(str)) { continue; } System.out.println(strArray[i]); } } }
[実行結果]
s m u r i
このプログラムでは文字列が”a”のときにcontinue文で表示する処理をスキップしているので、”a”以外の文字列が表示されています。
continue文は最も内側の1つのループをスキップするので、多重ループの場合は注意してください。多重ループの外側までスキップする場合には、ラベル付continue文を使います。
ラベル付きcontinue文の使い方など、continue文について詳しく知りたいときはこちらの記事を確認してください。
拡張for文とJava8のforEachメソッド
拡張for文の使い方
拡張for文は、配列やListなどのコレクションのすべての要素に対して順番に処理を行うために使います。拡張for文は通常のfor文と違って条件式と変化式が無いため、簡潔にコードが記述できます。
拡張for文の使い方を次のプログラムで確認してみましょう。
public class Main { public static void main(String[] args) { String[] strArray = { "s", "a", "m", "u", "r", "a", "i" }; for (String str : strArray) { System.out.print(str); } } }
[実行結果]
samurai
このプログラムでは拡張for文を使って、配列のすべての要素を順に表示しています。
拡張for文の使い方を確認することができました!
Java8のforEachメソッドの使い方
Java8でforEachメソッドとラムダ式が追加されました。これにより、さらに簡潔にコードが書けるようになりました。
forEachメソッドとラムダ式の使い方を次のプログラムで確認してみましょう。
import java.util.Arrays; public class Main { public static void main(String[] args) { String[] strArray = { "s", "a", "m", "u", "r", "a", "i" }; Arrays.stream(strArray).forEach(str -> System.out.print(str)); } }
[実行結果]
samurai
このプログラムでは配列をstreamに変換してから、forEachメソッドですべての要素を表示しています。
拡張for文とforEachメソッドのさらに詳しい使い方は、こちらの記事で解説しているのでぜひ確認してください!
まとめ
いかがでしたか?今回はfor文の使い方について解説しました。
for文はループ処理の基本なのでぜひ覚えてくださいね。
もし、for文を使ってループ処理を行う方法を忘れてしまったらこの記事を確認してください!