【问题标题】:Create array of empty subarrays in Ruby在 Ruby 中创建空子数组
【发布时间】:2019-01-26 04:51:32
【问题描述】:

我想创建一个包含 n 数量的不同空子数组的数组。

这是最好的方法吗?

Array.new(n){ [] }

如下,不过我看了cmets后修改了:

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

我试过了:

Array.new(n, [])

但它创建了一个数组,其中所有子数组都是同一个对象,这是我不想要的。

【问题讨论】:

  • 另一种方式:n.times.map { |_| [] }
  • 稍微简洁一点:Array.new(n){[]}
  • 闻起来像 XY 问题。也许你需要Matrix
  • @Neddy:还要注意,如果您有子数组 - 是否为空 - “父”数组不为空。
  • “一个空子数组的空数组”是自相矛盾的。空数组不包含任何内容。

标签: arrays ruby multidimensional-array


【解决方案1】:

Array.new(n) { [] } 完全没问题!
该块确保创建 Array 的新实例n 次。正如您所指出的,否则您将引用相同的对象(数组的实例)n 次。

【讨论】:

  • 这就是我要做的,我不确定是否有更正确的方法来做到这一点,但似乎没有。谢谢!
【解决方案2】:

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

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], [], [], []]

【讨论】:

  • 如开头所示,您可以简单地将块传递给new,为什么还要使用map
  • @Stefan 哎呀!编辑。谢谢。但我仍然不确定什么是 OP 问题。
  • 最初的问题是 “有没有比 Array.new(n){ |_| [] }”更好的方法,所以 OP 可能只是想知道是否有一种速记语法可以创建一个空数组。
【解决方案3】:

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

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

现在,将值放入数组中。

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

【讨论】:

  • x = [] 中的赋值是多余的,你只需要arr.map!{ [] }。这只是Array.new(n) { [] } 两行。
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 2020-10-08
  • 2012-11-23
  • 1970-01-01
  • 2015-08-13
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多