java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

break文とlabel

投稿日:

最終更新日:2016年06月25日

アイキャッチ

こんにちは。「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を使う方が良いのかもしれません。