ruby 。如果日期相等,则获取数组的平均值

标签 ruby arrays sorting

我有一个数组

[
 [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"], 
]

数组已经按日期排序。

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

最佳答案

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"]
#=> ]

关于 ruby 。如果日期相等,则获取数组的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24550319/

相关文章:

ruby-on-rails - 在现有路由的 rspec 测试中找不到路由

C++动态整数数组有时会导致崩溃

winforms - 排序组合框

ruby - 绑定(bind)方法到实例

ruby - 在 Ruby 中,为什么堆栈跟踪中没有变量名?

带有特殊字符的 Ruby 1.9

c - 指针数组 C - NULL POSITION

java - 利用 BinarySearch 进行自动完成练习

vba - 如何从最新到最旧对列进行排序?

python - 在 appengine 中对 collection_name 进行排序