Search code examples
rubyarraysmultidimensional-arraymatrixconways-game-of-life

How to declare a two-dimensional array in Ruby


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)

QUESTION UPDATED:

@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] ...

Solution

  • 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