2d array of hashes

A

Alex Raduca

Hi,

I am trying to solve the Sudoku Ruby Quiz using a 2d array of hashes
data model but I probably keep doing something wrong since the hashes
are referenced at row level(last row of the sudoku matrix is
referenced).

Could I get a hint on where I should insert the Hash.new when dealing
with 2d arrays. I have googled it but I could only find simple array of
hashes examples.

Thanks,
Alex



# creates sudoku matrix and fills it in with data
sudoku=Array.new(9,Array.new(9))
(0..8).each do |x|
(0..8).each do |y|

#load cell values into :values
sudoku[x][y]=Hash.new
print "load #{temp_ary[x][y]} in sudoku[#{x}][#{y}]\n"
sudoku[x][y][:value]=temp_ary[x][y]

#load possible solutions of this cell into :possibilities
if sudoku[x][y][:value]==0
sudoku[x][y][:possibilities]=[1,2,3,4,5,6,7,8,9]
end
end
end
 
J

Jesús Gabriel y Galán

Hi,

I am trying to solve the Sudoku Ruby Quiz using a 2d array of hashes
data model but I probably keep doing something wrong since the hashes
are referenced at row level(last row of the sudoku matrix is
referenced).

Could I get a hint on where I should insert the Hash.new when dealing
with 2d arrays. I have googled it but I could only find simple array of
hashes examples.

So, what is the data model you want? A different hash for each cell?
Then there is a problem here:
# creates sudoku matrix and fills it in with data
sudoku=Array.new(9,Array.new(9))

This creates an array of size 9, pointing 9 times to the same array. Check it:

ruby-1.8.7-p334 :001 > a = Array.new(9, Array.new(9))
ruby-1.8.7-p334 :002 > a[0].object_id
=> -611740938
ruby-1.8.7-p334 :003 > a[1].object_id
=> -611740938

So, if you add a hash to that inner array, all your rows will have the
same hash.
Try this:

sudoku = Array.new(9) { Array.new(9)}

or if you want to assign an empty hash right away:

sudoku = Array.new(9) { Array.new(9) {{}}}

now, each position in the array of arrays has its own independent hash:

ruby-1.8.7-p334 :003 > sudoku[0][0][:possibilities] = [1,2,3,4,5,6,7,8,9]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
ruby-1.8.7-p334 :004 > sudoku
=> [[{:possibilities=>[1, 2, 3, 4, 5, 6, 7, 8, 9]}, {}, {}, {}, {},
{}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}, {}, {}], [{}, {}, {},
{}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}, {}, {}], [{},
{}, {}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}, {}, {}],
[{}, {}, {}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}, {},
{}], [{}, {}, {}, {}, {}, {}, {}, {}, {}]]

Jesus.
 
A

Alex Raduca

to be more specific...

...I am creating 81 different new Hashes in the nested loops which I
verified to be true but when checking sudoku[0..8][y] outside the loop
they all have the same object_id
 
A

Alex Raduca

Hi Jesus,

Thanks for the help. Indeed, I didn't realize I was instantiating the 2d
array the wrong way.

Cheers,
Alex
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,012
Latest member
RoxanneDzm

Latest Threads

Top