【问题标题】:Splitting/Slicing array in rubyruby 中的拆分/切片数组
【发布时间】:2013-02-22 11:55:05
【问题描述】:

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

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

【问题讨论】:

  • "这应该将我的数组分成 5 个数组,每个数组有 200 个成员?但它没有?" ——你是怎么确定的?它完成了它应该做的事情:它将你的数组分成 5 个数组,每个数组有 200 个成员,然后打印 5 个数组中每个数组的前 5 个成员,不是吗?
  • 对,如果你为 each_slice 块提供一个参数,它会给你一个数组,如果你提供多个参数,那么它将填充这些参数,直到没有要填充的参数或有没有值可以填充它们,在这种情况下,额外的参数将为 nil。

标签: ruby-on-rails ruby


【解决方案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

【讨论】:

    【解决方案2】:
    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> 
    

    【讨论】:

      【解决方案3】:

      实际上,您将返回一个包含五个元素的字符串。 你可以试试:

      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 个元素。 我用最简单的语法来说明清楚,你可以 使其更加简洁。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2022-01-07
          • 1970-01-01
          • 2014-11-05
          • 2015-09-02
          • 2021-05-03
          • 1970-01-01
          • 2012-11-10
          • 2021-02-11
          • 2017-02-16
          相关资源
          最近更新 更多