Ruby中字符串的平均次数

时间:2013-11-26 17:14:39

标签: ruby arrays time average

我有一个数组:

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值,将字符串转换为整数并做一个平均值 - 但似乎有很多代码用于我想要做的事情。

3 个答案:

答案 0 :(得分:7)

(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

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

此处,reduce是获得数组平均值的可行方法and has been answered before.


这里有一个更简洁,更隐蔽的替代方案

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

答案 1 :(得分:1)

调整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

答案 2 :(得分:0)

由于某些原因,我没有得到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