2014-02-25 24 views
0

嗨,我是一個Ruby新手,可以使用下面的代碼一些幫助。Ruby二維數組轉置 - 變量不按預期工作

這應該是轉置一個二維數組。首先,我知道使用my_array.transpose將完成與整個方法相同的操作。這對我來說是一個學習練習,因爲我不知道爲什麼我的代碼正在做它的工作。

再次,這應該轉置一個2d數組。它實際上做的是用正確數量的嵌套數組(行)創建一個數組,但它們都是空的。

此外,我的方法似乎正在改變我不希望它做的my_array的值。它看起來像我的變量出了問題,我測試了代碼,並且new_row確實包含了正確的期望值,因爲它經過了它的循環 - 但不知何故,當我撥打new_row.clear時,它也擦除了new_array中的值。

編輯 - 澄清我的意思轉,考慮下面的代碼的陣列,該陣列換位應該是:
[
[0,4,8]
[1,5,9]
[2,6,10]
[3,7,11]
]

def my_transpose(inital_array) 
    new_row = [] 
    new_array = [] 
    new_row_start = 0 
    indexer = 0 

    row_count = inital_array.count 
    inital_array.flatten! 
    col_count = inital_array.count/row_count 

    col_count.times do 
    row_count.times do 
     new_row<<inital_array[indexer] 
     indexer += col_count 
    end 
    new_array<<new_row 
    new_row_start += 1 
    indexer = new_row_start 
    new_row.clear 
    end 
    return new_array 
end 

my_array = [ 
    [0,1,2,3], 
    [4,5,6,7], 
    [8,9,10,11] 
] 
new_array = my_transpose(my_array) 
print "old array:" 
print my_array.inspect 
puts 
print "new array:" 
puts new_array.inspect 
+0

轉換數組是什麼意思? –

+0

初始數組中的現有行應對應於新數組中的列,反之亦然。 – lwalden

回答

0

在紅寶石大多數對象存儲通過引用 - 陣列包括在內。你的情況發生了什麼是你正在追加new_rownew_array正確存儲行值。然後,您正在清除new_row。由於new_array具有對同一對象的引用,因此該行也在new_array中清除。

使用dup,當你將它添加到new_array創建一個新的數組對象:

new_array << new_row.dup 

,當你調用initial_array.flatten!同樣的情況發生。 flatten!方法修改接收器,並在函數之外更新由my_array引用的相同陣列。

+0

謝謝,這工作,我認爲這是沿線的東西,但不知道'dup'。 – lwalden

+0

看看伊斯梅爾的回答吧。他也有一些好點。 – 2014-02-26 00:04:19

1

你的問題很明顯。您正在清除剛纔創建的同一個數組。所以你失去了你的工作。

你想要的,而不是明確什麼是真正的創建一個新的數組:

new_row = [] 

關於爲什麼你正在改變my_array是因爲你使用的是爆炸方法。 flatten!。所有以大多數時間以!結尾的方法都是可變的方法。也就是說,他們改變了你所稱的對象。所以你使用它們時需要小心。

這是一個解決方法。只需指定返回新對象的正常flatten的結果即可。

inital_array = inital_array.flatten 
+0

謝謝,在閱讀了上面的其他答案後,我發現問題的一部分。看到在這種情況下如何使用new_row = []實現與使用'dup'和'clear'相同的結果,也說明了引用的工作方式。非常感激! – lwalden