2013-10-09 80 views
3

平均阵列我有我的Array类下面的方法:红宝石次:

class Array 
    def avg 
    if partial_include?(":") 
     avg_times 
    else 
     blank? and 0.0 or (sum.to_f/size).round(2) 
    end 
    end 

    def avg_times 
    avg_minutes = self.map do |x| 
     hour, minute = x.split(':') 
     total_minutes = hour.to_i * 60 + minute.to_i 
    end.inject(:+)/size 
    "#{avg_minutes/60}:#{avg_minutes%60}" 
    end 

    def partial_include?(search_term) 
    self.each do |e| 
     return true if e[search_term] 
    end 
    return false 
    end 
end 

这个伟大的工程与常规的数字数组,但有可能在那里我有次一个数组实例。

例如:[18:35, 19:07, 23:09]

反正找出时间对象的数组的平均?

+4

是那种格式的字符串或日期时间对象? – hirolau

+0

你可以调用'to_i'来获得总和和除法。如果你首先减去偏移量,速度会更快,所以你不使用'Bignum' – bdares

+0

他们曾经混合过,或者它总是数字或时间从来都不是? –

回答

2

所以你需要定义一个函数来计算格式化为字符串的时间的平均值。将数据转换为分钟,平均总分钟数,然后返回一次。当你打电话给你工作,你检查是否有/阵列中的所有项目被格式化为一个时间

a = ['18:35', '19:07', '23:09'] 

def avg_of_times(array_of_time) 
    size = array_of_time.size 
    avg_minutes = array_of_time.map do |x| 
    hour, minute = x.split(':') 
    total_minutes = hour.to_i * 60 + minute.to_i 
    end.inject(:+)/size 
    "#{avg_minutes/60}:#{avg_minutes%60}" 
end 

p avg_of_times(a) # = > "20:17" 

然后:

我会做这样的事情。也许使用正则表达式。

+0

当我运行该程序时,我的倾销值为“847/45:148/3” - 我使用新版本的Array类更新了我的问题 – dennismonsewicz

+0

对于最新版本的Ruby,这适用于我。如果你跳过最后一行,你会得到正确的分钟数吗? (在我上面的示例中是1217?)如果是这样,只需编写自己的“将分钟转换为小时和分钟”行。 – hirolau

+0

嗯...是啊我运行红宝石1.9.3 – dennismonsewicz