在ruby中将数组拆分成相等的部分

我需要一种方法来将数组分割成另一个大小相等的数组。 任何人都有这样做的方法?

例如

a = [0, 1, 2, 3, 4, 5, 6, 7] a.method_i_need(3) a.inspect => [[0,1,2], [3,4,5], [6,7]] 

您正在寻找Enumerable#each_slice

 a = [0, 1, 2, 3, 4, 5, 6, 7] a.each_slice(3) # => #<Enumerator: [0, 1, 2, 3, 4, 5, 6, 7]:each_slice(3)> a.each_slice(3).to_a # => [[0, 1, 2], [3, 4, 5], [6, 7]] 

也许我误解了这个问题,因为另一个答案已经被接受了,但是听起来好像你想把数组分成3个相等的组,而不pipe每个组的大小,而不是把它分成N个3个组作为以前的答案呢。 如果这就是你要找的,Rails(ActiveSupport)也有一个叫做in_groups的方法:

 a = [0,1,2,3,4,5,6] a.in_groups(2) # => [[0,1,2,3],[4,5,6,nil]] a.in_groups(3, false) # => [[0,1,2],[3,4], [5,6]] 

我不认为有一个ruby等价物,但是,你可以通过添加这个简单的方法得到大致相同的结果:

 class Array; def in_groups(num_groups) return [] if num_groups == 0 slice_size = (self.size/Float(num_groups)).ceil groups = self.each_slice(slice_size).to_a end; end a.in_groups(3) # => [[0,1,2], [3,4,5], [6]] 

唯一不同的是(正如你所看到的),这不会在所有的群体中传播“空白空间” 除了最后一组以外,每个组的大小都是相等的,最后一组总是包含所有的“空白”。

更新:正如@rimsky敏锐地指出的那样,上面的方法并不总是导致正确的数量的组(有时它会在最后创build多个“空组”),并将它们排除在外。 这里有一个更新的版本,从ActiveSupport的定义中减去,这个定义把额外的费用分摊到所需要的组中。

 def in_groups(number) group_size = size / number leftovers = size % number groups = [] start = 0 number.times do |index| length = group_size + (leftovers > 0 && leftovers > index ? 1 : 0) groups << slice(start, length) start += length end groups end 

尝试

 a.in_groups_of(3,false) 

它会做你的工作

正如mltsy写的, in_groups(n, false)应该做这个工作。

我只是想添加一个小窍门,以获得正确的平衡my_array.in_group(my_array.size.quo(max_size).ceil, false)

这里是一个例子来说明这个技巧:

 a = (0..8).to_a a.in_groups(4, false) => [[0, 1, 2], [3, 4], [5, 6], [7, 8]] a.in_groups(a.size.quo(4).ceil, false) => [[0, 1, 2], [3, 4, 5], [6, 7, 8]] 

这需要一些更好的巧妙来剔除额外的碎片,但这是一个合理的开始。

 def i_need(bits, r) c = r.count (1..bits - 1).map { |i| r.shift((c + i) * 1.0 / bits ) } + [r] end > i_need(2, [1, 3, 5, 7, 2, 4, 6, 8]) => [[1, 3, 5, 7], [2, 4, 6, 8]] > i_need(3, [1, 3, 5, 7, 2, 4, 6, 8]) => [[1, 3, 5], [7, 2, 4], [6, 8]] > i_need(5, [1, 3, 5, 7, 2, 4, 6, 8]) => [[1, 3], [5, 7], [2, 4], [6], [8]]