考虑到需要循环到任意的int值,将值转换为数组和每个数组的编程实践是否更好?或者只使用传统的for循环?
仅供参考,我正在计算多个6面骰子投掷中的5和6个结果(“命中”)的数量。我的任意int值是dicePool,它表示多次抛出的次数。
据我了解,有两种选择:
将dicePool转换为数组并为每个数组转换:
public int calcHits(int dicePool) {
int[] dp = new int[dicePool];
for (Integer a : dp) {
// call throwDice method
}
}
使用传统的for循环:
public int calcHits(int dicePool) {
for (int i = 0; i < dicePool; i++) {
// call throwDice method
}
}
我认为选项1是笨拙的代码,涉及不必要的数组创建,即使for-each循环比选项2中的传统for循环更有效。
答案 0 :(得分:12)
此时,速度并不重要(插入过早优化注释;)。 重要的是你能多快理解代码的作用,即调用方法dicePool
次。
第一个方法分配一个大小为dicePool
的数组并迭代其值,这恰好运行循环体dicePool
次(我假装你的意思是int
而不是{ {1}}以避免无关的自动装箱问题)。对于运行代码的计算机而言,这可能效率低下,但更重要的是,对于人类读取代码来说效率低下,因为它在概念上远离您想要完成的任务。具体来说,你强迫读者思考你刚刚创建的新数组,以及变量Integer
的值,它对于循环的每次迭代都是0,即使这些都不是你的最终目标。
任何查看第二种方法的Java程序员都会意识到你正在执行循环体a
次,dicePool
'向上计数'到i
。虽然后一部分并不是特别重要,但开始正是你打算做的。使用这种常见的Java习语可以最大限度地减少读者需要考虑的无关内容,因此它是最佳选择。
如有疑问,请简单操作。 :d
答案 1 :(得分:4)
为什么需要分配一个数组来循环一个可以安全递增和使用而不需要分配的变量?
这听起来非常低效。如果需要交换ints
的顺序,则可能需要分配数组,但事实并非如此。我肯定会去选项2 。
如果您想要对集合进行迭代,foreach
非常有用,但 创建集合只是为了迭代它 ,当您不需要它时只是没有意义..
答案 2 :(得分:2)
(2)是显而易见的选择,因为根据您的描述创建数组毫无意义。如果有,当然会发生变化。
答案 3 :(得分:2)
是什么让你认为for-each循环更有效?
对一个集合进行迭代很可能不如简单的循环和计数器。
如果您提供有关问题的更多上下文,这可能会有所帮助,特别是这个问题是否比选择另一个语法更多。我很难想到一个问题,#1将是一个更好的解决方案。
答案 4 :(得分:1)
我不会写第一个。没有必要在每个设置中使用最新语法。
你的直觉是好的:如果感觉并且看起来很笨拙,那可能就是。
去#2,晚上睡觉。