こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

for文とcontinue文

こんにちは。「Javaを復習する初心者」です。前回はbreak文を扱いました。ループの中で使うものとしてもう一つcontinue文があります。continue文を書いた箇所では、以降の処理を実行せず最も内側のループの次の繰り返しに処理が移ります。for (int i; …; i++)の場合、i+1が実行されてのfor文の中身の先頭に処理が移るということです。continue文以下を無視する雰囲気です。

解説

以下にフローを書きます。思い浮かんだ具体例は、出欠確認で出席者にはHelloを言い、欠席者には何も言わないという状況です。管理番号の配列と出欠の配列が与えられた場合を想定してプログラムしてみました。

出欠を定義する列挙型外部変数

修飾子

変数の型

変数名

内容
private

enum

Attendance

YES, NO

フロー

  1. 変数の定義と初期化
    管理番号を格納するint型配列nums

    要素番号

    0

    10
    1

    11
    2

    12
    3

    13
    4

    14

    出欠を格納するAttendance型配列attendance

    要素番号

    0

    YES
    1

    YES
    2

    NO
    3

    YES
    4

    YES
  2. 繰り返しカウンタiが0からnums.length未満まで以下の処理を実行する。
    1. “No.” + nums[i]をprintで出力する。
    2. attendances[i]がNOの場合
      1. printlnで改行する。
      2. continueで次の繰り返しに移る。
    3. ” Hello.”をprintlnで出力する。

以下はソースと実行結果です。

package test;

public class HelloContinue {

    private static enum Attendance {
        YES, NO
    }

    public static void main(String[] args) {

        int[] nums = {
                10, 11, 12,
                13, 14 };

        Attendance[] attendances = {
                Attendance.YES, Attendance.YES, Attendance.NO,
                Attendance.YES, Attendance.YES };

        for (int i = 0; i < nums.length; i++) {
            System.out.print("No." + nums[i]);

            if (attendances[i] == Attendance.NO) {
                System.out.println();
                continue;
            }

            System.out.println(" Hello.");

        }
    }

}
No.10 Hello.
No.11 Hello.
No.12
No.13 Hello.
No.14 Hello.

解説

System.out.printは改行なしでコンソールに出力するメソッドです。引数が必須です。一方、System.out.printlnは引数なしが用意されていて、改行のみ出力という処理になります。改行文字はシステムに応じたコードを出力するようです。

12番は欠席なのでHelloなしです。continue文が実行されて次の繰り返し処理に移ったということです。continue文の代わりにif-else文を使うことが可能な場合が多いと思うのですが、どちらが良いのかよくわかりません。特殊な場合を処理なしでスキップしたい場合、continueを書くと分かりやすいと思いますが、今回のサンプルは列挙型の値に応じた処理を記述するため、switch文が一番良いと改めて思いました。

前回は2重ループをlabelとbreak文を使って抜けるプログラムを書きましたが、continue文でもlabelが使えます。