将数组中每n个元素分为一组

3

I have an array:

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

如何将数组按照每n个元素分组?例如,对于3:

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

我写了这段代码,但它很丑陋:

array.each_with_index.group_by { |e, i| i % 3}.map {|h| h[1].map { |e| e[0] }}

1
@Makyen,快来帮助这个可怜的家伙。 - m0bi5
@MohitBhasi,我们不在这里为别人做作业。帮助他们,是的。替他们完成,不行。 - Makyen
4个回答

9
这里有一个简单的方法:
array.each_slice(3).to_a.transpose
#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 

5
尼克·维斯(Nick Veys)的回答最直接,但这里还有另一种方法。
array.group_by.with_index{|_, i| i % 3}.values
#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

1
这样更好,因为@NickVeys的解决方案在以下情况下无法正常工作:1)数组长度小于组数(例如,为3)2)当将数组长度除以组数时取模不为0时会出现错误。 - Vlad

0

尝试这种方式:

irb(main):002:0> a =  Array(1..9)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
irb(main):004:0> a.each_slice(3).to_a.transpose # good
=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

不是你想要的?告诉我吧


那不会只输出 [[1,2,3],[4,5,6],[7,8,9]] 吗? - Nick Veys

0

这也可以通过创建哈希表,然后提取值来完成。对于 Ruby 1.9+,这将保留数组元素的顺序。

代码

def bunch(arr,ngroups)
  arr.each_with_index.with_object(Hash.new { |h,k| h[k]=[] }) { |(e,i),h|
       h[i%ngroups] << e }
     .values
end

例子

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

bunch(arr,1) #=> [[1, 2, 3, 4, 5, 6, 7, 8, 9]] 
bunch(arr,2) #=> [[1, 3, 5, 7, 9], [2, 4, 6, 8]] 
bunch(arr,3) #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 
bunch(arr,4) #=> [[1, 5, 9], [2, 6], [3, 7], [4, 8]] 
bunch(arr,5) #=> [[1, 6], [2, 7], [3, 8], [4, 9], [5]] 
bunch(arr,6) #=> [[1, 7], [2, 8], [3, 9], [4], [5], [6]] 
bunch(arr,7) #=> [[1, 8], [2, 9], [3], [4], [5], [6], [7]] 
bunch(arr,8) #=> [[1, 9], [2], [3], [4], [5], [6], [7], [8]] 
bunch(arr,9) #=> [[1], [2], [3], [4], [5], [6], [7], [8], [9]] 

替代方案

如果参数改为每个组的大小grp_size,我们可以计算:

ngroups = (arr.size+grp_size-1)/grp_size

该方法的操作行可以改为以下写法:

arr.each_with_index.with_object({}) { |(e,i),h| (h[i%ngroups] ||= []) << e }
   .values

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接