2015-09-03 77 views
-1

IM試着通過所述第一值進行排序在紅寶石的二維陣列,這樣的:排序動態多維數組

files_array = Array.new(2) {Array.new} 

files_array[0][0] = 42 
files_array[1][0] = "/media/js/aefc015sdfsdf0728175535.js42" 
files_array[0][1] = 21 
files_array[1][1] = "/media/js/aefc015sdfsdf0728175535.js21" 
files_array[0][2] = 30 
files_array[1][2] = "/media/js/aefc015sdfsdf0728175535.js30" 

我試圖

files_array.sort!{|a,b| b[0] <=> a[0]} 

但它返回:

`sort!': comparison of Array with Array failed (ArgumentError) 

這就是我想要排序的陣列:

files_array[0][0] = 21 
files_array[1][0] = "/media/js/aefc015sdfsdf0728175535.js21" 
files_array[0][1] = 30 
files_array[1][1] = "/media/js/aefc015sdfsdf0728175535.js30" 
files_array[0][2] = 42 
files_array[1][2] = "/media/js/aefc015sdfsdf0728175535.js42" 

回答

0
`sort!': comparison of Array with Array failed (ArgumentError) 

這是因爲a[0]b[0]是數組的數組元素,即,它們是數組本身。

如果你這樣做:

files_array.sort!{|a,b| b[0][0] <=> a[0][0]} 

它的工作。順便說一下,這看起來像是一個關聯數組比數組數組更好的好例子。

files_hash = { 
    42 => "/media/js/aefc015sdfsdf0728175535.js42", 
    21 => "/media/js/aefc015sdfsdf0728175535.js21", 
    30 => "/media/js/aefc015sdfsdf0728175535.js30" 
} 

這不僅在代碼中更清晰,而且您不需要維護排序後的二維數組。

+2

你在第一段論證尚不清楚,但我想你指的是錯誤有人提出,因爲陣列與數組相比。如果你的意思是,那麼你的論點是錯誤的。錯誤發生的原因不是數組無法與一般數組進行比較,而是因爲給定的特定數組無法進行比較,因爲它們的元素無法進行比較(這意味着將fixnum與字符串進行比較)。 – sawa

+0

'files_array.sort!{| a,b | b:[0] [0] <=> a [0] [0]} 不適用於我,導致相同錯誤 - >''sort!':Array與Array的比較失敗(ArgumentError)' 虐待嘗試和檢查哈希建議 – Julli

0

試試這個它會爲你工作:

files_array = [[42,"/media/js/aefc015sdfsdf0728175535.js42"],[21,"/media/js/aefc015sdfsdf0728175535.js21"],[30,"/media/js/aefc015sdfsdf0728175535.js30"]] 

    sorted = files_array.sort { |x,y| x[0] <=> y[0] } 

puts sorted 

結果:

21 
/media/js/aefc015sdfsdf0728175535.js21 
30 
/media/js/aefc015sdfsdf0728175535.js30 
42 
/media/js/aefc015sdfsdf0728175535.js42 
+0

謝謝!適用於這個特定的情況。事情是我不能在開始時定義數組的長度和內容。這就是爲什麼我定義這樣的'files_array = Array.new(2){Array.new}'這樣的數組,所以我可以用'.push或<<'推入我的數據。但後來我不能使用我們的排序方法,它返回相同的錯誤。 – Julli