您如何简洁地从一系列房屋中获得平均房价?

时间:2009-07-23 01:19:03

标签: ruby arrays average

假设@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

为了获得平均值,这似乎是很多打字。

有更好的方法吗?

3 个答案:

答案 0 :(得分:14)

对可枚举集合使用inject方法。 Inject允许您传入'accumulator'的初始值(在本例中为0),然后对列表中的每个元素应用一些操作,并为累加器返回一个新值以传递给下一次迭代。

然后从inject调用返回累加器的最终值。

所以在这种情况下,我们只是将所有房价加到累加器中,然后最后除以总数。

你可以通过一些Ruby技巧获得更多的乐趣,并且可能会更多地压缩它,但这是合理可理解的,并且只在列表中迭代一次以添加值。

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

答案 1 :(得分:11)

Madlep的答案将适用于过去几年中任何版本的Ruby。但是如果您使用的是Ruby 1.8.7或更高版本,则可以将其简洁地表达为@houses.collect(&:price).inject(:+)/@houses.size

顺便提一下,我认为这种技术会慢一些,因为它必须循环两次,但是由于Ruby本身的优化,实际上在我的测试中使用Ruby 1.8.7时速度快了几百万,而且速度更快(但在Ruby 1.9中甚至超过1000万个项目。向您展示分析的重要性。

答案 2 :(得分:0)

如果您使用的是Rails应用程序,则可以执行array.sum / array.size