2015-08-14 57 views
-2

我轉置了M行和N列的二維數組,其中M是外部數組的長度,N是嵌套數組的長度(我在解決方案中考慮了不同的長度):而vs每個循環

a = [[1, 2], [3, 4, 5], [6], [7, 8, 9], [10, 11, 12]] 

each我工作的解決方案是:

(0..(@columns-1)).each do |col| 
    (0..(@rows-1)).each do |row| 
    print @ar[row][col] 
    end 
    print "\n" 
end 

,其結果是:

136710 
24-811 
-5-912 

作爲驗證的結果,我用'-'填充了空白點以使內部陣列具有相同的長度。

我試圖解決以下while循環的問題:

while @columns > 0 
    while @rows > 0 
    p @ar[(@rows - 1)][(@columns - 1)] 
    @rows = @rows - 1 
    end 
    @columns = @columns - 1 
end 

,結果是:

12 
9 
"-" 
5 
"-" 

爲什麼each循環工作而while循環沒有?

+0

在'while'版本中,您不會在外循環的每次迭代中重置'@ rows'。你以後也可能會使用這些變量,但是他們的值現在已經被破壞了。 –

+0

@TheF'@ rows'和'@ columns'不是數組,看來。 –

+0

@SergioTulentsev true。你的評論是完全正確的。 –

回答

1

的主要問題是,你離開你的內心行循環的第一次後,@rows被設置爲0。由於@rows永遠不會恢復到其原來的價值,@rows > 0仍然會是假的,你移動到下一列後。試試這個:

original_rows = @rows 
while @columns > 0 
    while @rows > 0 
    print @ar[(@rows - 1)][(@columns - 1)] # Also use `print` here, not `p` 
    @rows = @rows - 1 
    end 
    print "\n" # You also forgot this 
    @columns = @columns - 1 
    @rows = original_rows # Move back to the first row 
end 

當然,在實際應用中,以轉數組的最好辦法就是實際上只是:

@ar.transpose 

但是,這不是一個學習鍛鍊非常有幫助。

+0

雖然你的答案在技術上是正確的,但我可以'不管怎麼說,當你將@行數值設置回來時,不要使用局部變量'rows'。 – Borsunho

+0

我假設OP有一個原因。他沒有提供他正在使用的完整代碼,所以我試圖儘可能少地改變,同時仍然解決問題。我已經用一個忽略了這種限制的「現實世界」解決方案更新了我的答案。 – Ajedi32

+0

@Borsunho我使用實例變量,因爲我也在其他方法中使用它們。我沒有在我的問題中展示這些方法,因爲他們大多隻是驗證輸入,並不是真正與問題相關的所有內容。 – SoSimple