I want a twodimensional array in Ruby, that I can access for example like this:
if @array[x][y] == "1" then @array[x][y] = "0"
The problem is: I don't know the initial sizes of the array dimensions and i grow the array (with the <<
operator).
How do I declare it as an instance variable, so I get no error like this?
undefined method `[]' for nil:NilClass (NoMethodError)
@array = Array.new {Array.new}
now works for me, so the comment from Matt below is correct!
I just found out the reason why I received the error was because I iterated over the array like this:
for i in [email protected]
for j in 0..@array[0].length
@array[i][j] ...
which was obviously wrong and produced the error. It has to be like this:
for i in [email protected]
for j in 0..@array[0].length-1
@array[i][j] ...
A simple implementation for a sparse 2-dimensional array using nested 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
Usage:
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