【Java入門講座】7章.for文で繰り返し処理や無限ループをする方法

Java入門レッスン

☜前の章へ 条件分岐(if・else if・switch)
☞次の章へ メソッドの呼び出し方から引数と戻り値まで分かりやすく解説


【Java入門講座】は全10章から構成される、初心者向けのJava学習コンテンツです。1章から10章まで学習して頂くことでJavaの基礎を学習することができます。

この記事で分かること
  1. ループ処理とは
  2. ループ処理の書き方(for文・while文・do while文)
  3. 2重for文・多重ループの書き方
  4. break文とcontinue文の書き方
  5. 拡張for文(for-each文)の書き方
  6. forEachメソッドの書き方
  7. 無限ループの書き方

ループ処理(繰り返し処理)について学習していきます。

この記事を読めば、普通のループのやり方から2重ループ、無限ループなどができるようになります。

ループ処理とは

ループ処理(または繰り返し処理)は、同じ処理や指定された処理を、繰り返し実行するプログラムのことです。

ループを使用することで、同じ処理や指定された処理を、指定された条件が満たされるまで、繰り返すことができます

これにより、プログラムが効率的かつ簡潔になります。

ループ処理の書き方(for文・while文・do while文)

※上記の青い文字から読みたい項目へ移動することができます

Javaでループ処理を行う場合、for文、while文、do while文が基本の書き方になります。

それぞれ同じ処理を繰り返し行えるという点に関しては同じ性質を持ちます。

しかし、書き方など違いもあるのでそれぞれ見ていきましょう。

for文でのループ処理

for文の書き方
  • for (初期化式; 条件式; 更新式) {
    ループ内処理
    }
public class App {
    public static void main(String[] args) {

        System.out.println("ゲームを開始します。ゲームは10ターンで終了します。");

        for(int i = 1; i <= 10; i++) {
            System.out.println(i + "ターン目です");
        }

        System.out.println("ゲームを終了します。");

    }
}

出力結果

ゲームを開始します。ゲームは10ターンで終了します。 1ターン目です 2ターン目です 3ターン目です 4ターン目です 5ターン目です 6ターン目です 7ターン目です 8ターン目です 9ターン目です 10ターン目です ゲームを終了します。

(初期化式 int i = 1; 条件式 i <= 10; 更新式 i++)

  • 初期化式では、for文の中でのみ使用できる変数を宣言し初期化します
  • 条件式には、ループが終了する条件を書きます。今回は初期化式で初期化した変数iの値が10以下の間ループを続けるという条件にしています
  • 更新式には、初期化式で初期化された変数の値を増減させます。今回は1周ごとに変数iを1ずつ加算しています
for文が使用されるケース
  1. 特定の回数だけ繰り返しを行いたい場合
  2. あらかじめループ回数が決まっている場合

例えば、今回の例でも出したようにゲームなどでターンが決まっている場合に使うことが出来ます。

while文でのループ処理

while文の書き方
  • while (条件式) {
    ループ内処理
    更新式(書かなくても良い);
    }
public class App {
    public static void main(String[] args) {

        //初期化式
        int i = 5;

        System.out.printf("カウントダウン開始\n");

        while(i >= 0) {
            //ここに何か処理を書く
            System.out.println(i);
            i--;
        }
    
        System.out.println("End");

    }
}

出力結果

カウントダウン開始 5 4 3 2 1 0 End

while文はfor文とは違い、()の中に初期化式と更新式は書かず、条件式のみ書きます。

「i- -;」を書かないと無限ループになるので注意してください。

for文でもwhile文でも同じような処理は作れるのですが、while文の場合は主にあらかじめループ回数が決まっていない場合に使われます。

また、while文は特定の条件を満たしている場合にも使用されます。

while文が使用されるケース
  1. あらかじめループ回数が決まっていない場合
  2. 特定の条件を満たしている場合

上記の例は、基本的な書き方の紹介です。
もう少し分かりやすい、あらかじめループ回数が決まっていない場合の例も紹介します。

import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = "";

        while (!input.equals("yes")) {
            // ループ内処理
            // ユーザーの入力を待つ
            System.out.println("終了しますか?yesまたはnoを入力してください。");
            input = scanner.nextLine();
        }

        // Scannerを閉じる
        scanner.close();
    }
}

出力結果

終了しますか?yesまたはnoを入力してください。 no 終了しますか?yesまたはnoを入力してください。 no 終了しますか?yesまたはnoを入力してください。 no 終了しますか?yesまたはnoを入力してください。 yes

上記の例では、ユーザーがyesと入力するまでループするという処理になります。

例えば、ループ内処理では次のようなことができます。ユーザーが学校の先生だと想定すると、先生は生徒一人一人の成績を管理するために、全員分の成績を入力していきます。必要な分の入力が終われば、yesを入力して処理を終了します。

このように、あらかじめループ回数が決まっていない場合にwhile文は有効です。

do while文でのループ処理

do while文の書き方
  • do {
    ループ内処理
    更新式(書かなくても良い);
    } while(条件式);
import java.util.Scanner;

public class App {
    public static void main(String[] args) {

        int num = 1;
        Scanner scan = new Scanner(System.in);

        do {
            //ループ処理

            System.out.println("整数を入力して下さい");
            num = scan.nextInt();
        } while(num != 1);

        scan.close();

        System.out.println(num + "が入力されたのでループが終了します");

    }
}

出力結果

整数を入力して下さい 1 1が入力されたのでループが終了します

do while文はwhile文と同様に、特定の条件を満たしている間、ループ処理を行います。

do while文とwhile文の違いは、do while文は必ず1回は処理が行われるという特徴があります。

while文は最初に条件判定を行うためループ処理が行われない可能性がありますが、do while文は絶対にループ処理が1回は行われます。

そのためdo while文は1回は絶対にループ処理を行いたい場合に使用されます。

do while文が使用されるケース
  1. 1回は絶対にループ処理を行いたい場合

2重for文・多重ループの書き方

多重ループの書き方
  • for (初期化式; 条件式; 更新式) {
    for(初期化式; 条件式; 更新式) {
    }
    }

2重for文とは、ループの中でループを行うことです。

ループの中にループをいくつでも書けるので多重ループにすることもできます。

public class App {
    public static void main(String[] args) {

        for (int i = 1; i <= 5; i++) {
            System.out.printf("i=%d:", i);
            for(int j = 1; j <= 10; j++) {
                System.out.printf("%d", j);
            }

        System.out.printf("\n");
        
        }
    }
}

出力結果

i=1:12345678910 i=2:12345678910 i=3:12345678910 i=4:12345678910 i=5:12345678910

上記の例の場合、外側のループが1周するまでに、内側のループが10周しています。

最終的に外側のループが5周し、内側のループが50周します。

配列に値を代入する時などに使えます。

break文とcontinue文の書き方

break文とcontinue文の書き方
  1. break文
  2. continue文
※上記の青い文字から読みたい項目へ移動することができます

break文

public class App {
    public static void main(String[] args) {

        for (int i = 1; i <= 10; i++) {
            System.out.println(i);
            
            if(i == 5) {
                break;
            }
        }
    }
}

出力結果

1 2 3 4 5

iが5の時にループから抜けています。

このようにbreak文を使うとfor文で特定の条件を設定してループから抜けることができます。

while文とdo while文もbreak文を使えばループの途中で抜けることが出来ます。

public class App {
    public static void main(String[] args) {

        //初期化式
        int i = 5;

        while(i >= 0) {
            System.out.println(i);

            if(i ==2) {
                break;
            }

            i--;
        }
    
        System.out.println("End");

        do {
            i++;
            System.out.println(i);

            if(i == 5) {
                break;
            }
        } while(i <= 10);

        System.out.println("End");
    }
}

出力結果

5 4 3 2 End 3 4 5 End

continue文

public class App {
    public static void main(String[] args) {

        System.out.println("ゲームを開始します。ゲームは10ターンで終了します。");

        for(int i = 1; i <= 10; i++) {
            if(i % 2 != 0) {
                System.out.println(i + "ターン目:あなたの番です");
                continue;
            }

            System.out.println(i + "ターン目:相手の番です");
        }

        System.out.println("ゲームを終了します。");

    }
}

出力結果

ゲームを開始します。ゲームは10ターンで終了します。 1ターン目:あなたの番です 2ターン目:相手の番です 3ターン目:あなたの番です 4ターン目:相手の番です 5ターン目:あなたの番です 6ターン目:相手の番です 7ターン目:あなたの番です 8ターン目:相手の番です 9ターン目:あなたの番です 10ターン目:相手の番です ゲームを終了します。

上記の例は、if文でiが奇数かを判定し、iが奇数の場合は「あなたの番です」と表示するようにしています。

if文の中にcontinueがあることで「System.out.println(i + “ターン目:相手の番です”);」という処理は飛ばされて、ループ処理が最初から始まります。

このようにcontinue文は後続の処理をスキップする際に使用されます。

拡張for文(for-each文)の書き方|配列・ArrayList

※上記の青い文字から読みたい項目へ移動することができます

配列はこの後の章で学ぶので、理解できなくても大丈夫です。

拡張for文(for-each文)とは

拡張for文とは、コレクションや配列などの反復可能なオブジェクトを簡潔に処理するための構文のことです。

コレクションとは、複数の要素をまとめて扱うためのデータ構造やインターフェースのことを言います。

拡張for文は、for-each文とも呼ばれます

似たものにforEachメソッドというものがありますが、拡張for文(for-each文)とは別物なので注意してください。

普通のfor文でも、拡張for文と同じことができるのですが、拡張for文の方が簡潔に書けるというメリットがあります。

拡張for文(for-each文)の書き方

拡張for文の書き方
  • for(データ型 変数名 : 配列やコレクション) {
    // ループ内処理の例
    // System.out.println(変数名);
    }
import java.util.ArrayList;
public class App {
    public static void main(String[] args) {

        int[] numbers = {1, 2, 3, 4, 5};

        // 拡張for文を使用して配列の要素を順に取り出して処理
        for (int number : numbers) {
            System.out.println(number);
        }

    }
}

出力結果

1 2 3 4 5

配列については9章で解説しますが、このように配列を使ったfor文のことを拡張for文と言います。

配列numbersの要素をループごとに1つずつ変数numberに代入し、表示させています。

ArrayListを使った拡張for文も確認してみましょう

import java.util.ArrayList;
import java.util.List;

public class App {
    public static void main(String[] args) {

        List<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Orange");

        // 拡張for文を使用してリストの要素を順に取り出して処理
        for (String fruit : fruits) {
            System.out.println(fruit);
        }

    }
}

出力結果

Apple Banana Orange

ArrayListの場合も、拡張for文の書き方は配列と変わりません。

リストの要素を1つ1つ取り出すことができます。

forEachメソッドの書き方

メソッドはこの後の章で学ぶので、理解できなくても大丈夫です。

import java.util.ArrayList;
import java.util.List;

public class App {
    public static void main(String[] args) {
        
        List<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Orange");

        fruits.forEach(item -> System.out.println(item));

    }
}

出力結果

Apple Banana Orange

forEachメソッドは次のソースコードが該当します。

fruits.forEach(item -> System.out.println(item));

「item -> System.out.println(item)」の部分はラムダ式と言い、構文になっています。

ラムダ式の構文
  • (パラメータ) -> 処理

パラメータである変数itemが、変数fruitsの値を順番に受け取り、順番に表示しています。

無限ループの書き方

※上記の青い文字から読みたい項目へ移動することができます

VSCODEで無限ループの処理が止まらなくなった場合はターミナルを選択した状態で「Ctrl + C」で止めてください。またはターミナルにあるゴミ箱のようなアイコンから強制終了してください。

無限ループが発生してもパソコンは壊れないので安心してください。

for文での無限ループ

public class App {
    public static void main(String[] args) {
        for (int i = 0;; i++) {
            System.out.println(i);
        }
    }
}

出力結果

10804 10805 10806 10807 10808 10809 10810 10811 10812

for文では条件式を書かなければ無限ループにすることができます。

while文での無限ループ

public class App {
    public static void main(String[] args) {
        int i = 1;
        while (i < 5) {
            System.out.println(i);
        }
    }
}

出力結果

1 1 1 1 1 1 1 1

while文ではループ処理内で条件式を満たすような処理を書かなければ無限ループにすることができます。

do while文での無限ループ

public class App {
    public static void main(String[] args) {
        int i = 1;
        do {
            System.out.println(i);
        } while(i < 5);
    }
}

出力結果

1 1 1 1 1 1 1 1

do while文もwhile文と同様に、ループ処理内で条件式を満たすような処理を書かなければ無限ループにすることができます。


練習問題

コンソールにループ処理で次のように表示しましょう
123456789

public class App {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            System.out.print(i);
        }
        System.out.println();  // 改行
    }
}

出力結果

123456789

3回ループさせて、ループごとにyesかnoで解答できるクイズを作成しましょう

import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String userAnswer;

        for (int i = 0; i <= 2; i++) {
            switch (i) {
                case 0:
                    System.out.println("マリオの帽子は赤色?yesまたはnoを入力してください。");
                    userAnswer = scanner.next().toLowerCase();
                    if (userAnswer.equals("yes")) {
                        System.out.println("正解!");
                    } else {
                        System.out.println("残念...マリオの帽子は赤色です。");
                    }
                    break;
                case 1:
                    System.out.println("マリオの弟の名前はポワール?yesまたはnoを入力してください。");
                    userAnswer = scanner.next().toLowerCase();
                    if (userAnswer.equals("yes")) {
                        System.out.println("残念...マリオの弟の名前はルイージです。");
                    } else {
                        System.out.println("正解!");
                    }
                    break;
                case 2:
                    System.out.println("マリオの最大の敵の名前はカッパ?yesまたはnoを入力してください。");
                    userAnswer = scanner.next().toLowerCase();
                    if (userAnswer.equals("yes")) {
                        System.out.println("残念...マリオの最大の敵の名前はクッパです。");
                    } else {
                        System.out.println("正解!");
                    }
                    break;
                default:
                    break;
            }
        }

        scanner.close();
    }
}

出力結果

マリオの帽子は赤色?yesまたはnoを入力してください。 yes 正解! マリオの弟の名前はポワール?yesまたはnoを入力してください。 no 正解! マリオの最大の敵の名前はカッパ?yesまたはnoを入力してください。 yes 残念...マリオの最大の敵の名前はクッパです。

コンソールに次のように表示しましょう

123456789
123456789
123456789

public class App {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            for (int j = 1; j <= 9; j++) {
                System.out.print(j);
            }
            System.out.println();
        }
    }
}

出力結果

123456789 123456789 123456789

☜前の章へ 条件分岐(if・else if・switch)
☞次の章へ メソッドの呼び出し方から引数と戻り値まで分かりやすく解説