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
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
です。どちらも同じ動きをしてますね!だったら、ラベルを使ってスマート
なコードを書いたほうがいいですよね!
ラベルは基本的な構文なのに、意外と知られていません!
知らない人に教えてあげてみて下さい。きっと尊敬されますよ!