2011-01-27 31 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正確計算第一個例子中,應該增加只有當結果是排名結果 – Tonttu 2011-01-27 10:56:20