【问题标题】:Ruby, merging lazy sequencesRuby,合并惰性序列
【发布时间】:2014-05-14 11:16:32
【问题描述】:

让我有惰性序列:s1, s2, s3, ..., sN,具有非降序数字,例如:

s1 = [1, 1, 2, 3, 3, 3, 4, .....] s2 = [1, 2, 2, 2, 2, 2, 3, 3, 4, ....] s3 = [1, 2, 3, 3, 3, 3, 4, 4, 4, ....]

我想做的是合并它,按相似的项目分组并用一些函数处理它,例如生成元组列表(数字,计数)

就我而言:

merge(s1, s2, s3) 应该生成[ [1, 4], [2, 6], [3, 9], [4, 5], .... ]

是否有任何宝石等来处理此类序列

【问题讨论】:

  • @MarkThomas 我没有看到 lazy 这个词.. 谢谢你指点我。

标签: ruby stream merging-data


【解决方案1】:

如果你想偷懒,这里有一些代码可以做到这一点:

def merge(*args)
  args.map!(&:lazy)
  Enumerator.new do |yielder| 
    while num = args.map(&:peek).min
      count = 0
      while list = args.find { |l| l.peek == num }
        list.next
        list.peek rescue args.delete list

        count += 1
      end
      yielder.yield [num, count]
    end
  end
end

s1 = [1, 1, 2, 3, 3, 3, 4] 
s2 = [1, 2, 2, 2, 2, 2, 3, 3, 4] 
s3 = [1, 2, 3, 3, 3, 3, 4, 4, 4]
s4 = (0..1.0/0)

merge(s1, s2, s3, s4).take(20)
# => [[0, 1], [1, 5], [2, 8], [3, 10], [4, 6], [5, 1], [6, 1], [7, 1], [8, 1], [9, 1], [10, 1], [11, 1], [12, 1], [13, 1], [14, 1], [15, 1], [16, 1], [17, 1], [18, 1], [19, 1]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 2018-05-07
    • 2014-11-10
    • 2016-09-19
    • 1970-01-01
    • 2011-08-12
    • 2012-03-01
    • 2011-07-21
    相关资源
    最近更新 更多