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

break文とlabel

こんにちは。「Javaを復習する初心者」です。break文を使うと、繰り返し処理を抜けることができます。ただし、break文が抜けるのはbreak文が含まれている繰り返し処理の中で一番内側の繰り返し処理です。ではもうひとつ外側の繰り返し処理があったとして、そこを抜けるためにはどうするかというと、labelを使います。今回は2重ループの内側でbreak文を使い、外側のループを抜けるプログラムを書いてみました。(繰り返し処理とループが混在してます。すみません。)

プログラム

以下にフローを書きます。概要は所属学科が格納された2次元配列を走査して目的の値があったら処理を終えるプログラムです。(2次元配列で教室の座席表をイメージしています。)

フィールド

修飾子

変数の型

変数名

内容
private

enum

Department

MATHEMATICS, ENGLISH

フロー

  1. Department型2次元配列depsを定義し、以下の値で初期化する。
    ENGLISH

    ENGLISH

    ENGLISH
    ENGLISH

    ENGLISH

    ENGLISH
    ENGLISH

    ENGLISH

    ENGLISH
    ENGLISH

    MATHEMATICS

    ENGLISH
    ENGLISH

    ENGLISH

    ENGLISH
    ENGLISH

    ENGLISH

    ENGLISH
  2. 繰り返し変数iが0からdeps.length未満まで以下の処理を繰り返す。
    1. 繰り返し変数jが0からdeps[i].length未満まで以下の処理を繰り返す。
      1. Department型変数depにdeps[i][j]を格納する。
      2. “(” + i + “, ” + j + “) ” + depをprintlnで出力する。
      3. dep == Department.MATHEMATICSの場合、
        1. “found it.”を出力する。
        2. 2重ループを抜ける
  3. “end.”をprintlnで出力する。

「2重ループを抜ける」という文言については、これ以上適切な言葉が思いつきませんでした。そもそも、上の書き方だとラベルという文言が入ってませんが、書き方がわかりませんでした。

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

package test;

public class HelloBreakLabal {

    private static enum Department {
        MATHEMATICS, ENGLISH
    }

    public static void main(String[] args) {

        Department[][] deps = {
                { Department.ENGLISH, Department.ENGLISH, Department.ENGLISH },
                { Department.ENGLISH, Department.ENGLISH, Department.ENGLISH },
                { Department.ENGLISH, Department.ENGLISH, Department.ENGLISH },
                { Department.ENGLISH, Department.MATHEMATICS, Department.ENGLISH },
                { Department.ENGLISH, Department.ENGLISH, Department.ENGLISH },
                { Department.ENGLISH, Department.ENGLISH, Department.ENGLISH }
        };

        out: for (int i = 0; i < deps.length; i++) {
            for (int j = 0; j < deps[i].length; j++) {
                Department dep = deps[i][j];
                System.out.println("(" + i + ", " + j + ") " + dep);
                if (dep == Department.MATHEMATICS) {
                    System.out.println("found it.");
                    break out;
                }
            }
        }

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

    }

}
(0, 0) ENGLISH
(0, 1) ENGLISH
(0, 2) ENGLISH
(1, 0) ENGLISH
(1, 1) ENGLISH
(1, 2) ENGLISH
(2, 0) ENGLISH
(2, 1) ENGLISH
(2, 2) ENGLISH
(3, 0) ENGLISH
(3, 1) MATHEMATICS
found it.
end.

解説

labelの使い方ですが、抜けたい繰り返し処理のキーワード(forとか)に「[ラベル名]:」、抜けだす箇所に「break [ラベル名]」という使い方です。ラベル名は自由につけられるようです。(もちろん、予約語は使えません。forとか使えません。)上記の処理ではラベル名を「out」にしました。どのような命名が適切なのか不明だったため、「out」にしました。

labelは上記のような使い方なのですが、labelを使っていいのでしょうか。乱用するとフローがよくわからなくなる気がします。メソッドにしてreturnを使う方が良いのかもしれません。