javaで二重ループかきますか?


もちろん、かけますが、二重ループは、可読性を下げると思います。

可読性の高いコードをかくためには、二重ループのネストしているループを別メソッドにわけ、そのメソッド名にループの目的にそったメソッド名をつけ、外だししたメソッドの戻り値に、そのループで欲しかった値を戻せば、二重ループでも可読性を下げないと思います。

職場で、話題になりましたが、結構みんな二重ループを多用してました。

皆さんは、二重ループつかってますか?

可読性を下げないために、二重ループを私みたいにつかわない人はいますか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/05/16 23:40:07

回答1件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

書くか、書かないか、だけを問われれば、「書く」と答えます。

二重ループを書くかどうか、というのは、結果であって、そもそものところは、
メソッドの振る舞いを決まるときに、ループを意識させるかどうか、なのだと思います。
言い換えれば、クラス設計に、どれだけ心血を注いでいるかの、結果だと。

二重ループが適切なのかどうかは、内側のループだけに着目すれば良いと思います。
というか、そのループは必要なのか、という観点です。

例えば、極端な例として、複数のものからひとつを見つけて、何かをする場合。

    List list = target.getList(...);
    Iterator i = list.iterator();
    while (i.hasNext()) {
        Item item = i.next();
        if (item ...) {
            ...
            break;
        }
    }

なのか、

    Item item = target.findItem(...);
    if (list != null) {
        ...
    }

なのか。
target が複数あると、最初に書いた方は、二重ループになっちゃいますよね。

じゃあ、二重ループは駄目なのか、って話ですけど、探索方向が一次元に収まらなければ、多重ループになるのは必然です。
例えば、画像のビットマップがあって、特定のピクセルを探して処理するような場合には、横と縦の二重ループになるのは、当然ですよね。

    for (y = 0; y < image.sizeY() ; ++y) {
        for (x = 0; x < image.sizeX() ; ++x) {
            ...
        }
    }
}

教条的に、二重ループを嫌って、横方向の1ラインの探索を、別のメソッドに隠蔽するのは、ちょっとやり過ぎな感じがします。

    for (y = 0; y < image.sizeY() ; ++y) {
        image.searchLine(...);
    }
}
  • id:tdoi
    多重ループを使う、使わないというより、読みやすいコードかどうかしか気にしてません。
    例えば、次のような3重ループがあったとしましょう。
    for (int x = 0; x < MAX_X; ++x) {
    for (int y = 0; y < MAX_Y; ++y) {
    for (int z = 9; z < MAX_Z; ++z) {
    何か
    }
    }
    }
    ここの何かが
    volume[x][y][z] = 0;
    みたいなものなら、これを関数に分ける方が読みにくいでしょう。
    また、メモリの連続アクセスとかを意識するときには、このままの方が分かりやすいかと思います。
    かといって、この何かが数十行に及ぶ処理であれば、ループを減らすか、何かを関数にまとめるなりしないと読みに行くいと思います。

    2重ループが絶対悪だとは思わずに、読みやすいか、読みにくいかで判断される方がよいかなと。
    知り合いにネストは絶対に嫌って人がいるのも事実ですが。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません