1

これから質問する質問に似た 2 つの質問を見つけました。

配列を m サイズの n 個のグループに分割しますか? Rubyで 配列を指定されたサイズのサブ配列に分割する必要がある

これにより、配列が 3 つの配列に分割され、各配列には 3 つの要素が含まれます。

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

これにより、配列がそれぞれ 200 メンバーを持つ 5 つの配列に分割されますか? しかし、そうではありませんか?私が実際に行う必要があるのは、200 個のランダムな要素を 5 つの配列に入れることです。ここで正しい軌道に乗っていますか?どうすればこれを行うことができますか?

4

4 に答える 4

2

Enumerable#each_slice

each_sliceのブロックに単一の引数を指定すると、指定された引数以下の値の配列でその引数が埋められます。最後の反復で、残っている値がn未満の場合、配列サイズは残っているものになります。

each_sliceのブロックに複数の引数を指定すると、それらの値がソース配列の値で埋められます。スライスサイズが指定された引数の数よりも大きい場合、一部の値は無視されます。引数の数より少ない場合、過剰な引数はnilになります。

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
于 2013-02-22T12:19:57.753 に答える
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> 
于 2013-02-22T12:06:44.727 に答える
0

実際には、5 つの要素が挿入された文字列が返されます。あなたは何かを試すことができます:

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 つの配列になります。明確にするために可能な限り単純な構文を使用しましたが、もっと凝縮することができます。

于 2013-02-22T12:03:36.103 に答える
0

その結果を 5 つの異なる配列に割り当てたい場合は、次のように splat 演算子を使用できます。

a,b,c,d,e = *(1..1000).each_slice(200).to_a
于 2013-02-22T12:00:57.417 に答える