はじめに
ネストされたfor文の中でcontinueとbreakの挙動の違いを整理しました。
JavaScriptで記載していますが、Javaでも同様に記載できます。
目次
1. サンプル
2. continue
3. break
4. さらに深いループ
5. ラベルを使用したcontinue
6. ラベルを使用したbreak
7. まとめ
1. サンプル
次のような簡単な配列の多重ループを例にします。
const loopA = [1, 2];
const loopB = [1, 2, 3];
for (const a of loopA) {
for (const b of loopB) {
console.log(`A${a}-B${b}`);
}
}
// 出力結果↓↓
// A1-B1
// A1-B2
// A1-B3
// A2-B1
// A2-B2
// A2-B3
2. continue
continueはそのループの残りの処理をスキップして次のループへ移ります。
この例では内側のループ(loopB
)が2
のときは出力しません。
const loopA = [1, 2];
const loopB = [1, 2, 3];
for (const a of loopA) {
for (const b of loopB) {
if (b === 2) {
continue;
}
console.log(`A${a}-B${b}`);
}
}
// 出力結果↓↓
// A1-B1
// A1-B3
// A2-B1
// A2-B3
3. break
breakではそのループ自体が終了します。
先ほどのcontinue
と同じ場所でbreakを使用すると、内側のループ(loopB
)はそこで終了し、2
以降は出力されず外側のループ(loopA
)の次のループに移ります。
const loopA = [1, 2];
const loopB = [1, 2, 3];
for (const a of loopA) {
for (const b of loopB) {
if (b === 2) {
break;
}
console.log(`A${a}-B${b}`);
}
}
// 出力結果↓↓
// A1-B1
// A2-B1
4. さらに深いループ
今回はcontinueとbreakの違いを確認するため、さらに深く潜ってみます。
const loopA = [1, 2];
const loopB = [1, 2];
const loopC = [1, 2, 3];
for (const a of loopA) {
for (const b of loopB) {
for (const c of loopC) {
console.log(`A${a}-B${b}-C${c}`);
}
}
}
// 出力結果↓↓
// A1-B1-C1
// A1-B1-C2
// A1-B1-C3
// A1-B2-C1
// A1-B2-C2
// A1-B2-C3
// A2-B1-C1
// A2-B1-C2
// A2-B1-C3
// A2-B2-C1
// A2-B2-C2
// A2-B2-C3
これをサンプルに挙動の違いを確認していきます。
5. ラベルを使用したcontinue
ラベルを使用することで任意の場所でループを終了することができます。
今回はLABEL
としていますが、ラベルには任意の文字列を指定することができます。
const loopA = [1, 2];
const loopB = [1, 2];
const loopC = [1, 2, 3];
LABEL:for (const a of loopA) {
for (const b of loopB) {
for (const c of loopC) {
console.log(`A${a}-B${b}-C${c}`);
if (b === 2 && c === 1) {
continue LABEL;
}
}
}
}
// 出力結果↓↓
// A1-B1-C1
// A1-B1-C2
// A1-B1-C3
// A1-B2-C1
// A2-B1-C1
// A2-B1-C2
// A2-B1-C3
// A2-B2-C1
この例では2番目のループ(loopB
)が2
、3番目のループ(loopC
)が1
のときに1番目のループ(loopA
)の残りの処理をスキップして次のループへ移っています。
6. ラベルを使用したbreak
次は先ほどのcontinueと同じ位置、同じ条件でbreakを使用してみます。
const loopA = [1, 2];
const loopB = [1, 2];
const loopC = [1, 2, 3];
LABEL:for (const a of loopA) {
for (const b of loopB) {
for (const c of loopC) {
console.log(`A${a}-B${b}-C${c}`);
if (b === 2 && c === 1) {
break LABEL;
}
}
}
}
// 出力結果↓↓
// A1-B1-C1
// A1-B1-C2
// A1-B1-C3
// A1-B2-C1
条件を満たすことでラベルをつけたloopA
がbreakされ、それ以降の処理が実行されなくなります。
7. まとめ
今回のような単純な例でも「どこのループだっけ?」と可読性が落ちているように感じました。
ラベルの使い方を理解しておくことでループの扱い方の幅が広がるかと思います。