比each_slice更平衡的数组操作?

时间:2011-09-16 02:29:21

标签: ruby-on-rails ruby

我有一个包含10个项目的数组,我想将它分成3个部分,如下所示:

[1, 2, 3, 4]
[5, 6, 7]
[8, 9, 10]

使用each_slice我可以近距离接触:

a = *(1..10)
a.each_slice(4) # use 4 so I can fit everything into 3 sections

[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10]

但我希望第一种格式更均匀地分布。我可以写自己的方法。 但是在ruby 1.9 +中有没有内置的方法呢?

更新

由于没有内置方式,我想将问题更改为 - 您将如何实施?

1 个答案:

答案 0 :(得分:3)

这是我的实施

  def chunk(a, pieces)
     size = a.size / pieces
     extra = a.size % pieces
     chunks = []
     start = 0

     1.upto(pieces) do |i|
       last = (i <= extra) ? size.next : size
       chunks << a.slice(start, last)
       start = chunks.flatten.size
     end

     chunks
   end

这样称呼

a = *(1..10)
puts chunk(a, 3)

将输出

[1, 2, 3, 4]
[5, 6, 7]
[8, 9, 10]

如果件尺寸太大,则用空阵列填充

a = *(1..10)
puts chunk(a, 14)

将输出

[[1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [], [], [], []]