4

任意の int 値にループアップする必要がある場合、値を配列に変換して配列を for-each にするか、従来の for ループを使用する方が良いプログラミング方法ですか?

参考までに、6 面ダイスを複数回投げて、5 と 6 の結果 (「ヒット」) の数を計算しています。私の任意の int 値は、複数のスローの数を表す dicePool です。

私が理解しているように、2つのオプションがあります。

  1. dicePool を配列に変換し、配列を for-each します。

    public int calcHits(int dicePool) {
       int[] dp = new int[dicePool];
       for (Integer a : dp) {
         // call throwDice method
       }
    }
    
  2. 従来の for ループを使用します。

    public int calcHits(int dicePool) {
       for (int i = 0; i < dicePool; i++) {
         // call throwDice method
       }
    }
    

for-each ループはオプション 2 の従来の for ループよりも効率的ですが、オプション 1 は扱いにくいコードであり、不必要に配列を作成する必要があるというのが私の見解です。

4

5 に答える 5

12

この時点では、速度は重要ではありません (時期尚早の最適化のコメントを挿入してください ;)。重要なのは、コードが何をするか、つまりメソッドを何回も呼び出すかをどれだけ早く理解できるかですdicePool

最初のメソッドは、サイズの配列を割り当て、dicePoolその値を反復処理します。これにより、たまたまループ本体が実行されます(関連のないオートボクシングの問題を回避する代わりに、dicePool意図したふりをします)。これは、コードを実行するコンピューターにとっては非効率的である可能性がありますが、さらに重要なことは、達成したいことから概念的に離れているため、コードを読む人間にとっては非効率的です。具体的には、読者に、作成したばかりの新しい配列と、ループの反復ごとに 0 になるvariable の値について考えるように強制します。ただし、どちらも最終目標には関係ありません。intIntegera

2 番目の方法を見ている Java プログラマーは、まで「カウントアップ」してループ本体のdicePool時間を実行していることに気付くでしょう。後半は特に重要ではありませんが、最初はまさに​​あなたが意図したことです。この一般的な Java イディオムを使用すると、読者が考えなければならない無関係なことを最小限に抑えることができるため、これが最良の選択です。idicePool

迷ったらシンプルに。:D

于 2010-04-25T15:00:25.207 に答える
4

安全にインクリメントして割り当てを必要とせずに使用できる変数をループするために配列を割り当てる必要があるのはなぜですか?

不必要に非効率に聞こえます。順序を入れ替える必要がある場合は、配列を割り当てる必要がありますがints、そうではありません。私は確かにオプション2を選びます。

foreachコレクションを反復処理したい場合に便利ですが、必要のないときに反復処理するためだけにコレクションを作成するのは意味がありません..

于 2010-04-25T14:58:50.360 に答える
2

for-eachループの方が効率的だと思う理由は何ですか?

セットを反復処理することは、単純なループとカウンターよりも効率が悪い可能性が非常に高くなります。

問題についてより多くのコンテキストを提供した場合、特に、一方の構文を他方よりも選択するよりもこの質問に多くのことがあるかどうかが役立つ場合があります。#1がより良い解決策となる問題を考えるのに苦労しています。

于 2010-04-25T15:00:58.823 に答える
2

(2)は、説明に基づいて配列を作成する意味がないため、明らかな選択です。あると、もちろん状況は変わります。

于 2010-04-25T14:59:45.937 に答える
1

最初のものは書きません。すべての設定で最新の構文を使用する必要はありません。

あなたの本能は優れています。

#2に行き、夜は寝ます。

于 2010-04-25T14:58:43.273 に答える