【问题标题】:Ruby. Get an average value of array IF dates are equal红宝石。如果日期相等,则获取数组的平均值
【发布时间】:2014-07-03 09:46:18
【问题描述】:

我有一个数组数组

[
 [3, "2014-06-28"], 
 [3, "2014-06-29"], 
 [3, "2014-06-30"], 
 [27, "2014-07-02"], 
 [7, "2014-07-02"]
]

如果日期相等,我想得到它们的平均值,这样上面的数组就会变成

[
 [3, "2014-06-28"], 
 [3, "2014-06-29"], 
 [3, "2014-06-30"], 
 [17, "2014-07-02"], 
]

数组已经按日期排序。

我该怎么做呢?我是否使用递归函数?

【问题讨论】:

  • 好的,您想要日期相同的第二列的平均值吗?对吗?
  • 那么第一列呢?也应该是平均值吗?
  • 为了清楚起见,我已经编辑了问题
  • 你的数组默认是按日期排序的吗? :)
  • 是的,它是按日期排序的

标签: ruby arrays sorting


【解决方案1】:
arr = [
        [3, "2014-06-28"], 
        [3, "2014-06-29"], 
        [3, "2014-06-30"], 
        [27, "2014-07-02"], 
        [7, "2014-07-02"]
      ]

arr.group_by(&:last).map do |k, vs|
  av = vs.map(&:first).inject(:+) / vs.size.to_f
  [av, k]
end

#=> [
#=>   [3.0, "2014-06-28"], 
#=>   [3.0, "2014-06-29"], 
#=>   [3.0, "2014-06-30"], 
#=>   [17.0, "2014-07-02"]
#=> ]

如果您正在寻找更优化但不那么惯用的解决方案(并且您的数据集按日期排序),您可以按照以下步骤操作:

arr = [
        [3, "2014-06-28"], 
        [3, "2014-06-29"], 
        [3, "2014-06-30"], 
        [27, "2014-07-02"], 
        [7, "2014-07-02"]
      ]

res = []
tmp = [0]
cnt = 0
arr.each do |num, date|
  if tmp[1] && tmp[1] != date
    tmp[0] /= cnt.to_f
    res << tmp
    tmp = [0]
    cnt = 0
  end
  tmp[0] += num
  tmp[1] = date
  cnt += 1
end
tmp[0] /= cnt.to_f
res << tmp
res

#=> [
#=>   [3.0, "2014-06-28"], 
#=>   [3.0, "2014-06-29"], 
#=>   [3.0, "2014-06-30"], 
#=>   [17.0, "2014-07-02"]
#=> ]

【讨论】:

  • 如果我在每个数组中有一个额外的值,例如[1400496920000, 2, "2014-05-19"]。我将如何编辑您的第二个示例以平均数组中的第二个值?
  • 结果应该是什么?包含两项或三项的数组?
猜你喜欢
  • 2019-05-16
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多