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

时间:2013-12-15 20:33:45

标签: ruby arrays initialization default

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

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

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

我知道我可以使用两个嵌套的each循环来完成它,但我想知道是否还有其他方法?

2 个答案:

答案 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 }}