代码之家  ›  专栏  ›  技术社区  ›  Neddy

用Ruby创建空子数组数组

  •  2
  • Neddy  · 技术社区  · 6 年前

    n 不同的空子阵列数。

    Array.new(n){ [] }
    

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

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

    我试过:

    Array.new(n, [])
    

    3 回复  |  直到 6 年前
        1
  •  1
  •   knugie    6 年前

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

        2
  •  2
  •   iGian    6 年前

    所有提出的方法来得到这个数组 [[], [], [],...] 工作正常:

    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], [], [], []]
    
        3
  •  0
  •   Cryptex Technologies    6 年前

    请试试这个。对我有用。

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

    现在,将值放入数组中。

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