2013-02-22 92 views
1

我发现这个类似的两个问题之一,我要问:劈裂/切片阵列中的红宝石

Split array up into n-groups of m size?Need to split arrays to sub arrays of specified size in Ruby

这阵分裂为三个阵列,其每个数组三个要素:

a.each_slice(3) do |x,y,z| 
    p [x,y,z] 
end 

所以,如果我这样做(我的数组大小为1000):

a.each_slice(200) do |a,b,c,d,e| 
      p "#{a} #{b} #{c} #{d} #{e}" 
     end 

这应该将我的数组分成5个数组,每个数组有200个成员?但它不? 我真正需要做的是将200个随机元素放入5个数组中,我在正确的轨道上,我该怎么做?

+0

“这应该将我的数组分成5个数组,每个数组有200个成员?但它不? - 你是怎么确定的?它确实完成了它应该做的事情:它将你的数组分成5个数组,每个数组有200个成员,然后打印5个数组中每个数组的前5个成员,不是吗? – 2013-02-22 12:03:07

+0

对,如果你为each_slice块提供了一个参数,它会给你一个数组,如果你提供了多个参数,那么它将填充这些参数,直到没有参数填充或者没有值填充它们在这种情况下,额外的参数将为零。 – Cluster 2013-02-22 12:07:47

回答

1
irb(main):001:0> a= (1..10).to_a 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
irb(main):002:0> a.sample(3) 
=> [5, 10, 1] 
irb(main):003:0> (1..3).map{ a.sample(3) } 
=> [[6, 2, 5], [8, 7, 3], [4, 5, 7]] 
irb(main):004:0> 
0

如果你想那个结果分配给5个不同的阵列,您可以使用图示操作,像这样:

a,b,c,d,e = *(1..1000).each_slice(200).to_a 
0

其实你会返回一个字符串插在它的五行。 你可以试一下:

a1 = [], a2 = [], a3 = [], a4 = [], a5 = [] 

a.each_slice(5) do |a,b,c,d,e| 
    a1 << a 
    a2 << b 
    a3 << c 
    a4 << d 
    a5 << e 
end 

你最终将包含每200元5个阵列。 我用最简单的语法来说清楚,你可以使它更加简洁。

1

Enumerable#each_slice

如果提供一个单一的参数来each_slice的块然后将填充值的阵列参数小于或等于给定的参数。在最后一次迭代中,如果剩余的值小于n,那么数组的大小将是剩下的值。

如果您为each_slice块提供了多个参数,那么它将使用源数组中的值填充这些值。如果切片大小大于给定的参数数量,则一些值将被忽略。如果它小于参数的数量,那么超出的参数将为零。

a = (1..9).to_a 

a.each_slice(3) {|b| puts b.inspect } 
[1,2,3] 
[4,5,6] 
[7,8,9] 

a.each_slice(4) {|b| puts b.inspect } 
[1,2,3,4] 
[5,6,7,8] 
[9] 

a.each_slice(3) {|b,c,d| puts (b + c + d)} 
6 # 1 + 2 + 3 
15 # 4 + 5 + 6 
24 # 7 + 8 + 9 

a.each_slice(3) {|b,c| puts (b + c)} 
3 # 1 + 2, skips 3 
9 # 4 + 5, skips 6 
15 # 7 + 8, skips 9 

a.each_slice(2) {|b,c| puts c.inspect} 
2 
4 
6 
8 
nil 

a.each_slice(3) {|b,c,d,e| puts e.inspect} 
nil 
nil 
nil