4

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

这似乎是为了获得一个平均值而进行的大量输入。

有没有更好的办法?

4

3 回答 3

14

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

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

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

您可以使用一些 Ruby Skillz 变得更有趣,并可能将其压缩得更多,但这是可以理解的,并且只遍历列表一次以将值相加。

@houses.inject(0){|total, house| total + house.price} / @houses.size
于 2009-07-23T01:31:45.263 回答
11

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

顺便说一句,我曾假设这种技术会更慢,因为它必须循环两次,但由于 Ruby 本身的优化,在我对 Ruby 1.8.7 的测试中,它实际上要快得多,达到几百万个项目,而且更快(但不是一样多)甚至超过 Ruby 1.9 中的 1000 万个项目。去向你展示分析的重要性。

于 2009-07-23T01:31:54.577 回答
0

如果你在 Rails 应用程序中,你可以做 array.sum/array.size

于 2009-08-16T05:52:58.147 回答