Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Ruby'计算平均值;s注入特性_Ruby_Coding Style_Iteration_Average - Fatal编程技术网

如何使用Ruby'计算平均值;s注入特性

如何使用Ruby'计算平均值;s注入特性,ruby,coding-style,iteration,average,Ruby,Coding Style,Iteration,Average,我认为Ruby的inject方法非常适合计算总和。但是如果我必须计算一个平均值并使用inject,我总是会得到这样的结果: total_ranked_query_results = @results.count { |result| result.class == RankedQueryResult } @results.inject(0.0) { |sum, result| result.class == RankedResult ? sum + result.average_precisio

我认为Ruby的
inject
方法非常适合计算总和。但是如果我必须计算一个平均值并使用
inject
,我总是会得到这样的结果:

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)方法来避免这种情况?

在同一次迭代中进行计数和求和:

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

在第一个示例中,tmp.last计算不正确,仅当结果为RankedResult时才应增加