Ruby中字符串的平均次数

我有一个数组:

array = ["0:00:31", "0:00:52", "0:01:05", "0:00:55", "0:01:33", "0:00:05", "0:00:01", "0:05:10", "0:02:40", "0:03:03", "0:01:33", "0:00:00"] 

我需要平均数组中不等于"0:00:00""0:00:00"应该被抛弃。

最好的方法是什么? 我正在循环遍历数组,删除所有0:00:00值,将字符串转换为整数并做一个平均值 – 但它似乎是我想要做的很多代码。

 (sz = array.reject {|t| t == '0:00:00' }). map {|t| Time.parse t }. reduce(0) {|a, t| a += t.to_i }.to_f / sz.size 

您希望将这些内容分组为function操作。 拒绝你不需要的东西,然后采取其他行动。

在这里, reduce是获得arrays平均值的可行方法, 并且之前已经得到了回答。


这是一个更简洁,更隐秘的替代方案

 (sz = array.reject {|t| t == '0:00:00' }). map {|t| Time.parse(t).to_i }. reduce(:+).to_f / sz.size 

调整NewAlexandria对秒内返回平均值的回答:

 (sz = array.reject {|t| t == '0:00:00' }). map {|t| t.split(":").inject(0){|product,n| product * 60 + n.to_i} }. reduce(0) {|a, t| a += t.to_i }.to_f / sz.size 

由于某种原因,我没有得到NewAlexandria的工作答案,这是我将如何做到的:

 def average_of_times(array) zero_seconds = ->x{ x=='0:00:00' } covert_to_seconds = ->x do hours, minutes, seconds = x.split(':').map(&:to_i) hours * 3600 + minutes * 60 + seconds end seconds = array.reject!(&zero_seconds) .map(&covert_to_seconds) .reduce(:+) / array.size Time.at(seconds).utc.strftime("%H:%M:%S") end