我想在
Ruby中使用二维数组,我可以像下面这样访问:
if @array[x][y] == "1" then @array[x][y] = "0"
问题是:我不知道数组维度的初始大小,并且我增长了数组(使用<<运算符). 如何将其声明为实例变量,所以我没有这样的错误?
undefined method `[]' for nil:NilClass (NoMethodError)
问题更新:
@array = Array.new {Array.new}
现在对我有用,所以下面马特的评论是正确的!
我刚刚发现我收到错误的原因是因为我迭代了这个数组:
for i in 0..@array.length for j in 0..@array[0].length @array[i][j] ...
for i in 0..@array.length-1 for j in 0..@array[0].length-1 @array[i][j] ...
解决方法
使用嵌套Hashes的稀疏二维数组的简单实现,
class SparseArray attr_reader :hash def initialize @hash = {} end def [](key) hash[key] ||= {} end def rows hash.length end alias_method :length,:rows end
用法:
sparse_array = SparseArray.new sparse_array[1][2] = 3 sparse_array[1][2] #=> 3 p sparse_array.hash #=> {1=>{2=>3}} # # dimensions # sparse_array.length #=> 1 sparse_array.rows #=> 1 sparse_array[0].length #=> 0 sparse_array[1].length #=> 1