2015-09-03 44 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