2011-01-27 52 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