どのように簡潔に家屋の配列からの平均住宅価格を得るのですか?
質問
次のように@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
呼び出しから返されます。
だから、このケースでは、私たちは最終的に合計数で割り、アキュムレータにすべての住宅価格を追加します。
あなたは値を追加するために、一度リストをファンキー取得し、おそらくいくつかのRubyのファルカンとより多くのそれを圧縮し、これは合理的に理解できる、とだけ繰り返し処理することができます。
@houses.inject(0){|total, house| total + house.price} / @houses.size
他のヒント
Madlepの答えは、過去数年からルビーの任意のバージョンで動作します。あなたはRubyの1.8.7以降を使用している場合しかし、あなたは@houses.collect(&:price).inject(:+)/@houses.size
としてもう少し簡潔にそれを表現することができます。
ちなみに、私はそれが二回ループしているので、この技術が遅くなるだろうと想定していたが、ルビー自体での最適化のおかげで、それは(夫婦百万ルビー1.8.7に私のテストでのアイテム、そして速くまでずっと速く、実際のですRuby 1.9のではなく、できるだけ多くすることによって)であっても、過去10万件。あなたのプロファイリングの重要性を示すことを行く。
あなたがRailsのアプリにしている場合は、あなたが行うことができますarray.sum / array.size