2015-04-15 106 views
0

我試圖轉置[[0, 1, 2], [3, 4, 5], [6, 7, 8]]。我得到[[2, 5, 8], [2, 5, 8], [2, 5, 8]]使用「每個」方法將值賦給二維數組

我可以看到線p transposed_arr發生了什麼,但不明白爲什麼會發生這種情況。在每一次迭代中,它都會改變每一行,而不是隻改變一行。

def my_transpose(arr) 
    # number of rows 
    m = arr.count 

    #number of columns 
    n = arr[0].count 

    transposed_arr = Array.new(n, Array.new(m)) 

    # loop through the rows 
    arr.each_with_index do |row, index1| 

     # loop through the colons of one row 
     row.each_with_index do |num, index2| 

      # swap indexes to transpose the initial array 
      transposed_arr[index2][index1] = num 
      p transposed_arr 
     end 
    end 
    transposed_arr 
end 
+0

THX卡里,它的工作原理... –

+0

現在你的代碼工作,考慮postin在[代碼評論](http://codereview.stackexchange.com/)中獲取改進建議。如果你以前沒去過那裏,我想你會留下深刻的印象。這裏發佈的許多問題都來自新手,所以它不是一點點的恐嚇。 –

回答

3

你只需要做一個小小的改變,你的方法就能正常工作。替換:

transposed_arr = Array.new(n, Array.new(m)) 

與:

transposed_arr = Array.new(n) { Array.new(m) } 

前者使transposed_arr[i]相同的對象(大小m的陣列),用於所有i。後者產生大小m的每個i

情況下,單獨陣列1:

transposed_arr = Array.new(2, Array.new(2)) 
transposed_arr[0].object_id 
    #=> 70235487747860 
transposed_arr[1].object_id 
    #=> 70235487747860 

情況2:

transposed_arr = Array.new(2) { Array.new(2) } 
transposed_arr[0].object_id 
    #=> 70235478805680 
transposed_arr[1].object_id 
    #=> 70235478805660 

與該改變您的方法返回:

[[0, 1, 2], 
[3, 4, 5], 
[6, 7, 8]]