如何在Ruby中创建一个零多维数组?

时间:2015-09-16 09:20:40

标签: ruby

要创建一维数组,我可以写:

arr = Array.new(10) { |z| 0 }
#=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

但我想知道如何以更多维度初始化数组,例如:

#=> [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

这只是一个例子。我试图了解一般情况。

5 个答案:

答案 0 :(得分:4)

您可以轻松嵌套多个Array.new来电:

Array.new(2, 0)
#=> [0, 0]

Array.new(3) { Array.new(2, 0) }
#=> [[0, 0], [0, 0], [0, 0]]

Array.new(4) { Array.new(3) { Array.new(2, 0) } }
#=> [[[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]]]

请注意,非块版本(即Array.new(2, 0))应仅用于不可变对象,因为同一对象将用于所有元素。有关详细信息,请参阅Common gotchas部分。

要构建任意维度的数组,可以使用递归:

def multi_array(sizes, default = nil)
  size, *remaining = sizes
  if remaining.empty?
    Array.new(size, default)
  else
    Array.new(size) { multi_array(remaining, default) }
  end
end

multi_array([4, 3, 2], 0)
#=> [[[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]]]

答案 1 :(得分:2)

如果更多维度是指数组数组,您可以尝试:

arr = Array.new(10){|z| z=Array.new(2,0)}
# => [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0,0]]

假设您的第二个维度是2

答案 2 :(得分:2)

你也可以这样做:

Array.new(10, 0).each_slice(2).to_a
# => [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]

5.times.map{Array.new(2, 0)}
# => [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]

答案 3 :(得分:0)

这是另一种方式,虽然我觉得每个级别的深层副本都可以以某种方式简化:

def make_multi(dimensions, default)
  dimensions.reverse.each_with_index.reduce([]) { |a,(d,i)|
    Array.new(d) { i.zero? ? default : Marshal.load(Marshal.dump(a)) } }
end

arr = make_multi [4,3,2,2], 0
  #=> [[[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]]] 

arr[0][0][0][0] = 1
arr
  #=> [[[[1, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]]] 

arr = make_multi [4,3,2,2], {}
  #=> [[[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]],
  #    [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]],
  #    [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]],
  #    [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]]]

arr[0][0][0][0] = { a: 1 }
arr
  #=> [[[[{:a=>1}, {}...] # all but the first are empty hashes

答案 4 :(得分:-1)

尝试一下:)

arr = Array.new(10, 0)
多维的

UPD:是:

arr = Array.new(10, Array.new(2, 0))
=> [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]