【问题标题】:How do I assign default values for two-dimensional array?如何为二维数组分配默认值?
【发布时间】:2013-12-15 20:33:45
【问题描述】:

我有一个这样创建的二维数组:

array = Array.new(10){Array.new(10)}

如何在初始化时为每个单元格分配默认值?

我知道我可以使用两个嵌套的 each 循环来做到这一点,但我想知道是否还有其他方法?

【问题讨论】:

  • 为第二个参数提供值。 array = Array.new(10) { Array.new(10, 4) }
  • @kiddorails 非常感谢!
  • kiddorails 应该把它写成答案
  • @DavidGrayson Erm,好的。我刚刚发表评论,因为这个问题非常琐碎,并且可能在某处重复。无论如何,我会将其添加为答案。

标签: ruby arrays initialization default


【解决方案1】:

只需提供带有值的第二个参数:

array = Array.new(10) { Array.new(10, 4) }

这里,默认值为4,因此创建了一个10*10的二维数组,默认值为4

【讨论】:

    【解决方案2】:

    二维数组

    要制作你的二维数组,你可以按照 Kiddorails 说的做:

    array = Array.new(10) { Array.new(10, 4) }
    

    或者你可以这样做:

    array = 10.times.collect { [0] * 10 }
    

    错误的二维数组

    虽然下面的代码很诱人(有两个人试图用它来回答这个问题),但它不是制作二维数组的正确方法:

    array = [[0] * 10] * 10  # BAD
    

    这实际上创建了一个包含 10 个零的数组,这很好,但随后它创建了另一个数组,其中仅包含对该数组的十个引用。上面的代码只创建了两个数组!

    类似于二维数组的哈希

    实现这种数据结构的另一种更类似于 Ruby 的方式是使用散列并使用 x,y 坐标对作为键。这很好,因为它使 2D 数组中的位置成为一流的对象,您可以轻松地四处传递,而不必担心该位置的精确表示方式。遍历每个点变得更容易,因为您不必有嵌套循环,这意味着复制数据可能会更容易。此外,Ruby 的哈希结构有一个功能可以让您设置默认值,因此您不必做任何棘手的工作来初始化数据。

    下面是一些展示这个想法的示例代码:

    hash = {}
    hash.default = 0
    hash[[4,6]]      # => 0
    hash[[4,6]] = 1
    hash.inspect     # { [4, 6] => 1 }
    

    如果需要,您还可以使用自己定制设计的对象作为哈希键:

    class Point < Struct.new(:x, :y)
    end
    hash = {}
    hash.default = 0
    hash[Point[4, 6]] = 1
    

    无论你做什么,小心不要修改任何你用作散列键的对象,否则你会不小心修改散列中的数据并实际上搞砸散列的内部结构,需要rehash .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2020-09-05
      • 2022-10-23
      相关资源
      最近更新 更多