通过求和值

时间:2015-11-06 13:46:38

标签: arrays ruby

我有一个哈希数组,其中每个哈希都有一个size键:

blocks = [{size: 1},{size: 3},{size: 4}]

现在我想通过聚合size值并定义4的上限来将此数组拆分为子数组。在每个子数组中,size键的总和值应小于4

我有这个解决方案,但它并不漂亮或优雅:

arr = []
tmp = []
sum = 0

blocks.each do |block|
  sum += block[:size]
  tmp.push(block)
  if sum >= 4
    arr.push(tmp)
    sum = 0
    tmp = []
  end
end

也许有人知道更像红宝石的优雅解决方案。

1 个答案:

答案 0 :(得分:1)

有一种方法可以使用slice_when

sum = 0
blocks.slice_when do |elt_before, _|
  sum += elt_before[:size]
  sum >= 4 ? (sum = 0; true) : false
end.to_a

编辑:根据@CarySwoveland建议

如果使用slice_after

,它会变得更简单
sum = 0
blocks.slice_after do |elt|
  sum += elt[:size]
  sum >= 4 ? (sum = 0; true) : false
end.to_a

同时注明slice_when& slice_after首次出现在Ruby v.2.2