便利なコードパーツ集!

やまろうのプログラミングTips

Java

JavaにGoto文がある?ラベルで多重にネストしたループを抜け出す

投稿日:

2004/06

今回は多重にネストしたループを抜け出す方法をご紹介します。
といっても、フラグを使って自力で脱出するわけではありません。
ラベルを使います。awtのLabelじゃないよ!C言語のGoto文のようなラベルです。
Javaの場合はJump(Goto)する場所が限定されています。コードを見たほうが
早いので、ソース行ってみよう!

package etc;

/**
 * ネストしたループを自力/ラベルで抜け出すサンプル。
 */
public class LoopLabelSample {

  public static void main(String[] args) {
    doLabelBreak();
    doSelfBreak();
    doLabelContinue();
    doSelfContinue();
  }

  /**
   * フラグを使って自力でネストしたループをbreakする。(だせー)
   */
  private static void doSelfBreak() {
    System.out.println("start doSelfBreak");
    boolean breakFlag = false;
    for (int i = 0; i < 10; i++) {
      System.out.println("i=" + i);
      for (int j = 0; j < 10; j++) {
        System.out.println("j=" + j);
        if (j == 2) {
          breakFlag = true;
          break;
        }
      }
      if (breakFlag == true) {
        break;
      }
    }
  }

  /**
   * ラベルを使ってネストしたループをbreakする。(かっこいい)
   */
  private static void doLabelBreak() {
    System.out.println("start doLabelBreak");
    LOOP1 : for (int i = 0; i < 10; i++) {
      System.out.println("i=" + i);
      for (int j = 0; j < 10; j++) {
        System.out.println("j=" + j);
        if (j == 2) {
          break LOOP1;
        }
      }
    }
  }
  
  /**
   * フラグを使って自力でネストしたループをcontinueする。(だせー)
   */
  private static void doSelfContinue() {
    System.out.println("start doSelfContinue");
    boolean continueFlag = false;
    for (int i = 0; i < 5; i++) {
      System.out.println("i=" + i);
      for (int j = 0; j < 5; j++) {
        System.out.println("j=" + j);
        if (j == 2) {
          continueFlag = true;
          break;
        }
      }
      if (continueFlag == true) {
        continue;
      }
    }
  }

  /**
   * ラベルを使ってネストしたループをcontinueする。(かっこいい)
   */
  private static void doLabelContinue() {
    System.out.println("start doLabelContinue");
    LOOP1 : for (int i = 0; i < 5; i++) {
      System.out.println("i=" + i);
      for (int j = 0; j < 5; j++) {
        System.out.println("j=" + j);
        if (j == 2) {
          continue LOOP1;
        }
      }
    }
  }
}

ネストしたループをフラグで自力で抜けるのとラベルでスマートに抜ける
例が書かれています。
実行結果

start doLabelBreak
i=0
j=0
j=1
j=2
start doSelfBreak
i=0
j=0
j=1
j=2
start doLabelContinue
i=0
j=0
j=1
j=2
i=1
j=0
j=1
j=2
i=2
j=0
j=1
j=2
i=3
j=0
j=1
j=2
i=4
j=0
j=1
j=2
start doSelfContinue
i=0
j=0
j=1
j=2
i=1
j=0
j=1
j=2
i=2
j=0
j=1
j=2
i=3
j=0
j=1
j=2
i=4
j=0
j=1
j=2

です。どちらも同じ動きをしてますね!だったら、ラベルを使ってスマート
なコードを書いたほうがいいですよね!

ラベルは基本的な構文なのに、意外と知られていません!
知らない人に教えてあげてみて下さい。きっと尊敬されますよ!

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2024 AllRights Reserved Powered by AFFINGER4.