如何为二维数组指定默认值?

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

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

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

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

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

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

这里,默认值为4 ,因此,创建一个默认值为4的10 * 10 2Darrays。

二维数组

为了制作你的二维数组,你可以做一些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的哈希结构具有允许您设置默认值的function,因此您不必执行任何棘手的工作来初始化数据。

以下是一些显示该想法的示例代码:

 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 

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