在红宝石中拆分/切片阵列

时间:2013-02-22 11:55:06

标签: ruby-on-rails ruby

我发现这个问题与我要提出的问题类似:

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个数组中,我是否在正确的轨道上,我该怎么做?

4 个答案:

答案 0 :(得分: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> 

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果要将结果分配给5个不同的数组,可以使用splat运算符,如下所示:

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

答案 3 :(得分: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个元素。 我用尽可能简单的语法来说清楚,你可以 使它更加浓缩。