2016-08-11 127 views
0

我創建了一個二維數組,整個二維數組像這樣填充了9。如何更改ruby中二維數組中元素的值?

matrix = Array.new(5,(Array.new(5,9))) 

接着我打印整個陣列

puts "#{matrix}" # => [[9, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9]] 

接着我分配1[0][0]位置。

matrix[0][0] = 1 

然後我再次打印矩陣

puts "#{matrix}" # => [[1, 9, 9, 9, 9], [1, 9, 9, 9, 9], [1, 9, 9, 9, 9], [1, 9, 9, 9, 9], [1, 9, 9, 9, 9]] 

所以,這裏的情況!爲什麼每一行都受到這個任務的影響。不應該只是改變[0][0]的位置。 我正在使用ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

+0

線索在輸出中。看看'matrix.each {| a |把a.object_id}'返回。 –

+0

他們都一樣!得到你的觀點 –

+0

'matrix = Array.new(5,Array.new(5,9))'(你不需要額外的parens)與'arr = Array.new(5,9);矩陣= Array.new(5,arr)'。得到它了? –

回答

5

基本上,您對每個子陣列使用相同的數組引用。像這樣做

matrix = Array.new(5) { Array.new(5, 9) } 
+0

你知道我的聲明發生了什麼。你的聲明是魅力! –

1

的問題是,你沒有創建5個不同的陣列:

matrix = Array.new(5,(Array.new(5,9))) 

此代碼創建一個新的數組,然後使用5次。所以,當你的第一陣列的單元設置爲0,你實際上它們都設置爲0。

要解決這個問題,你需要創建單獨的陣列,例如這樣:

matrix = [] 

5.times do 
    matrix.push(Array.new(5,9)) 
end 

然後代碼將以您期望的方式工作:

matrix[0][0] = 5 
    puts matrix # [[5, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9], [9, 9, 9, 9, 9]] 
+0

你的解釋真的很好! –

+0

這很有效,但是創建'matrix'的慣用方式與@ursus一樣。 –