1

我发现这两个问题与我要问的问题相似:

将数组分成 n 组 m 大小? 并且 需要在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 个数组中,我在正确的轨道上,我该怎么做?

4

4 回答 4

2

可枚举#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
于 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 个不同的数组,您可以使用 splat 运算符,如下所示:

a,b,c,d,e = *(1..1000).each_slice(200).to_a
于 2013-02-22T12:00:57.417 回答
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 个元素。我使用了最简单的语法来使其清晰,您可以使其更加简洁。

于 2013-02-22T12:03:36.103 回答