2013-02-22 93 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