我想在
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