假设@houses阵列被设置如下:

house1.price = 10
house2.price = 20
house3.price = 30
@houses << house1
@houses << house2
@houses << house3

这是我们计算的起点,我们希望找到一所房子均价:

total = 0
average = 0
for h in @houses
 total += h.price
end
average = total/@houses.size

这似乎是相当多的打字只是为了得到一个平均的。

有没有更好的办法?

有帮助吗?

解决方案

上可枚举集合使用 inject 方法。注入允许您在初始值传递给一个“累加器”(0在这种情况下),然后应用一些操作以在列表中的每个元素,并返回储液器要传递到下一次迭代的新值。

蓄能器的最终值然后从inject呼叫返回。

因此,在这种情况下,我们只是添加了所有的房价到累加器,然后最后由总数量除以。

您可以得到funkier,可能与一些红宝石的skillz更压缩了下去,但是这是可以理解的合理,并通过列表只迭代一次,加起来的值。

@houses.inject(0){|total, house| total + house.price} / @houses.size

其他提示

Madlep的答案将在从过去几年的Ruby的任何版本。但如果你使用Ruby 1.8.7或更高版本,可以更简洁地表达它一点点@houses.collect(&:price).inject(:+)/@houses.size

顺便说一句,我曾以为这种技术将变得更慢,因为它必须循环两次,但由于在Ruby中本身的优化,它实际上是更快了一对夫妇在我的关于Ruby 1.8.7测试万件,更快(在Ruby 1.9的,但多达不是),甚至近10万件。去告诉你分析的重要性。

如果您在Rails应用程序的时候,你可以做array.sum / array.size

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top