はじめに

JAVA言語では、ループ処理を行う時に「for文」や「while文」を用いると以前に説明しました。
【Java入門】繰り返し処理をマスターしよう!(forとwhile) 

【Java入門】繰り返し処理をマスターしよう!(forとwhile)


今回は多重ループ(ループ文の中にループ文を入れるネスト構造)について説明していきます。

多重ループ(ループのネスト構造)

ループ文は、1重ループ(for文1つだけ)であれば複雑ではないためコードを見る分にも理解もしやすいです(可読性が高い)。
多重ループではネストが深くなればなるほど複雑となり、プログラミングする上で間違い易くもなりますし、可読性も落ちます。
ただ、可読性が落ちるからと言ってすべてを1重ループにするわけにもいかなく、ネスト構造にした方が分かりやすくスッキリしている場合もあります。
今回は、ループのネスト構造でよく用いられる身近な例で理解していきましょう。

掛け算の九九でネスト構造を理解しよう!

皆さんも知っているであろう掛け算の九九。九九は以下の様に計算していきますよね。
1の段:1×1、1×2、1×3 ‥‥ 1×9
2の段:2×1、2×2、2×3 ‥‥ 2×9
3の段:3×1、3×2、3×3 ‥‥ 3×9


9の段:9×1、9×2、9×3 ‥‥ 9×9
これらの九九、全ての計算式と答えを出力しようとする場合どのようにしたらいいでしょうか。

重ループのみで九九を実装

ネストを深くし過ぎないということを意識しすぎて、1重ループで九九を実装しようとした場合、以下のように非常に長いコードを書かなければなりません。

出力結果は以下となりました。
(出力結果は長すぎるので途中で切っています。)

1重ループのみで九九を実現しようとした場合、「1の段用」「2の段用」「3の段用」‥‥「9の段用」と9つのfor文を用意しないといけません。
⇒今回の例だと、40行近くプログラミングする羽目になります。
1つ1つのfor文を見るだけなら
「このfor文は、”1″を定数として1~9を順に掛けて計算している」
「このfor文は、”2″を定数として1~9を順に掛けて計算している」
と理解し易いかもしれませんが、修正しようとした際に大幅に手がかかりますし、似た内容が多いだけに間違いも発生しやすいです。
⇒例えば、1の段のfor文をコピーして2~9の段まで作った場合に数字を変更するのを忘れる等。

2重ループで九九を実装

先ほど1重ループで実装した九九が、2重ループにしただけで非常にスッキリしたコードで実現することが出来ます。

出力結果は以下となりました。
(出力結果は長すぎるので途中で切っています。)

for文1つで九九を実装しようとしていた時に比べて、圧倒的にコードがスッキリしているのがおわかりでしょうか。
⇒先ほどと違い、たった10行程度で実装できています。
この2重ループの説明をすると、

①外側のfor文で、まず「iの値が1」から開始。
②内側のfor文に入り、「j」の値が「1~9」まで順にループされる。
9回ループすると終了し、内側のfor文を抜ける。
③外側のループ1周目終わり、継続式によりインクリメントされ「iの値が2」となる。
条件式(i <= 9)を満たしているので外側のfor文はまだ継続される。
⑤内側のfor文に入り、「j」の値が「1~9」まで順にループされ、9回ループすると終了。
⇒②の処理と一緒
⑥外側のループが2周目終わり、インクリメントされ「iの値が3」となる
⇒③の処理と一緒
⑦「iの値が9以内」まで続く。

このように、それぞれの段につき9回ループして(1~9を掛ける)計算する処理を実装することが出来ます。

まとめ

いかがでしたでしょうか?
今回は多重ループについて、九九を例に説明してきました。
1重ループに比べてコードがスッキリすることは出来ましたが、先ほども説明したようにネストが深くなればなるほど複雑になりがちですし、間違いは発生しやすいです。
先ほどの例で、内側のfor文では「j」はもちろんのこと「i」もスコープ範囲内です。
j」と記述しようとしていた所に「i」と記述してもエラーにはならないので、気づかずに実装して実行したら想定外の動作をするということもあり得えます。
プログラミングする際には注意しましょう。