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のスキルを使えば、もっとファンキーになり、おそらくもっと圧縮することができますが、これはかなり理解でき、リストを1回繰り返すだけで、値を合計できます。

@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.

ちなみに、この手法は 2 回ループする必要があるため遅くなると思っていましたが、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 に答える