在Ruby中创建空子数组的数组

时间:2018-08-20 04:43:45

标签: arrays ruby multidimensional-array

我想创建一个which scriptcs个不同的空子数组。

这是最好的方法吗?

n

如下,但是我在阅读评论后进行了修改:

Array.new(n){ [] }

我尝试过:

Array.new(n){ |_| [] }

但是它创建了一个数组,所有子数组都是同一个对象,我不希望这样做。

3 个答案:

答案 0 :(得分:1)

Array.new(n){ [] }很好!该块可确保创建新的Array实例n次。正如您所指出的,否则您将多次引用同一对象(Array的实例)。

答案 1 :(得分:1)

所有建议的用于获取数组[[], [], [],...]的方法都可以正常工作:

Array.new(n, []) # the best, 20 times faster
Array.new(n){ [] }
n.times.map { [] }

第一个是最快的,所以是最好的,但是效果很奇怪(请参阅下一个)。

  

它创建了一个数组,所有子数组都是同一个对象

如果我明白这一点,那么您的意思是所描述的方法会发生以下情况:

a = Array.new(5, [])
p a # => [[], [], [], [], [], [], [], [], [], []]
p a.map { |e| e.object_id} # => [70189488740180, 70189488740180, 70189488740180, 70189488740180, 70189488740180]]

对象是相同的,因此,如果您尝试用值填充子数组,则所有子数组都假定为相同的值(重复):

a[0][0] = 10
p a # => [[10], [10], [10], [10], [10]]

为避免这种情况,请不要传递默认值,而应映射到空数组:

a = Array.new(5).map{ |e| [] }
p a # => [[], [], [], [], []]

或通过障碍

a = Array.new(5){ [] }
a = 5.times.map { [] }

现在每个子数组都是一个独立的对象:

p a.map { |e| e.object_id} # => [70253023825640, 70253023825620, 70253023825600, 70253023825580, 70253023825560]

如果您插入一些值,则不会进行复制:

a[0][0] = 10
a[1][0] = 20
p a # => [[10], [20], [], [], []]

答案 2 :(得分:0)

请尝试这个。它对我有用。

  n = 15
  arr = Array.new(n)
  arr.map!{ |x| x = [] }

现在,将值放入数组中。

arr[0][0] = 10 
arr[5][0] = 50
p arr # => [[10], [], [], [], [], [50], [], [], [], [], [], [], [], [], []]