如何为二维数组指定默认值?
我有一个像这样创建的二维数组:
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
无论你做什么,小心不要修改你用作散列键的任何对象,否则你会不小心修改散列中的数据并实际搞砸了散列的内部结构,需要重新散列。