どのように簡潔に家屋の配列からの平均住宅価格を得るのですか?

StackOverflow https://stackoverflow.com/questions/1169099

  •  19-09-2019
  •  | 
  •  

質問

次のように@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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top