4

鉴于需要循环到任意 int 值,将值转换为数组并 for-each 数组是更好的编程实践,还是只使用传统的 for 循环?

仅供参考,我正在计算多次投掷 6 面骰子的 5 和 6 结果(“命中”)的数量。我的任意 int 值是 dicePool ,它表示多次抛出的次数。

据我了解,有两种选择:

  1. 将 dicePool 转换为数组并为每个数组:

    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
       }
    }
    

我的观点是选项 1 是笨拙的代码并且涉及不必要的数组创建,即使 for-each 循环比选项 2 中的传统 for 循环更有效。

4

5 回答 5

12

在这一点上,速度并不重要(插入过早优化注释;)。重要的是你能多快理解代码的作用,也就是调用方法的dicePool次数。

第一种方法分配一个大小数组dicePool并遍历它的值,这恰好运行循环体dicePool时间(我会假装你的意思intInteger避免不相关的自动装箱问题)。这对于运行代码的计算机来说可能效率低下,但更重要的是,对于阅读代码的人来说效率低下,因为它在概念上与您想要完成的目标相去甚远。具体来说,你迫使读者思考你刚刚创建的新数组,以及变量的值,a对于循环的每次迭代,它都是 0,即使这些都与你的最终目标无关。

任何查看第二种方法的 Java 程序员都会意识到您正在执行循环体dicePool时间,并且i“计数”到dicePool. 虽然后半部分不是特别重要,但开头正是您想要做的。使用这个常见的 Java 习语可以最大限度地减少读者需要考虑的无关事物,因此它是最佳选择。

如有疑问,请保持简单。:D

于 2010-04-25T15:00:25.207 回答
4

为什么需要分配一个数组来循环一个可以安全递增和使用而无需分配的变量?

这听起来不必要地低效。如果需要交换顺序,则可能需要分配一个数组,ints但事实并非如此。我肯定会选择选项2

foreach你想迭代一个集合时很有用,但是创建一个集合只是为了在你不需要它时迭代它是没有意义的。

于 2010-04-25T14:58:50.360 回答
2

(2) 是显而易见的选择,因为根据您的描述,创建数组没有意义。如果有,当然情况会改变。

于 2010-04-25T14:59:45.937 回答
2

是什么让您认为 for-each 循环更有效?

迭代一个集合很可能比一个简单的循环和计数器效率低。

如果您提供有关该问题的更多上下文可能会有所帮助,特别是该问题是否比选择一种语法而不是另一种语法更多。我很难想到#1 会是更好的解决方案的问题。

于 2010-04-25T15:00:58.823 回答
1

我不会写第一个。不必在每个设置中都使用最新的语法。

你的直觉是好的:如果它感觉和看起来很笨拙,它可能是。

和#2一起去,晚上睡觉。

于 2010-04-25T14:58:43.273 回答