我有一个像这样创建的二维数组:
array = Array.new(10){Array.new(10)}
如何在初始化时为每个单元格分配默认值?
我知道我可以使用两个嵌套的each
循环来完成它,但我想知道是否还有其他方法?
答案 0 :(得分:8)
只需提供值为的第二个参数:
array = Array.new(10) { Array.new(10, 4) }
此处,默认值为4
,因此会创建一个默认值为4
的10 * 10 2D阵列。
答案 1 :(得分: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
无论你做什么,都要小心不要修改你用作哈希键的任何对象,否则你会不小心修改哈希中的数据并实际搞砸了哈希的内部结构,需要{{3 }}