2011-01-27 9 views
3

Rubyのinjectメソッドは、合計を計算するのに本当にきれいだと思います。私は平均値を計算し、injectを使用する必要がある場合でも、私はいつもこのようなもので終わる: Rubyの注入機能で平均を計算する方法

total_ranked_query_results = @results.count { |result| result.class == RankedQueryResult } 
@results.inject(0.0) { |sum, result| result.class == RankedResult ? sum + result.average_precision : sum }/total_ranked_query_results 

は、だから私は基本的に平均値を計算するためにありますどのように多くの RankedResultsを見つけるために二回反復しなければなりません。

これを回避するには、より良い(rubyesque)方法がありますか?

答えて

3

いずれに同じ繰り返しのカウントと合計行います

tmp = @results.inject([0.0, 0]) { |sum, result| 
    if RankedResult === result 
     [sum.first + result.average_precision, sum.last+1] 
    else 
     sum 
    end 
} 
tmp.first/tmp.last 

あるいは、第一のフィルタコレクション:

tmp = @results.filter { |result| RankedResult === result } 
tmp.inject(0.0) { |sum, result| sum+result.avergage_precision }/tmp.length 
+1

tmp.lastが誤って計算された最初の例では、それがインクリメントされなければならないが結果がPopularityResultの場合のみ – Tonttu

+0

ありがとう、固定:-) – arnaud576875

関連する問題