2011-08-11 22 views
18

Ok, supongo que tengo una matriz como [[z, 1], [d, 3], [e, 2]], ¿cómo puedo ordenar esta matriz por segundo elemento de cada conjunto constituyente? ¿Para que mi matriz se vea como la siguiente? [[z, 1], [e, 2], [d, 3]]?Ordenar una matriz bidimensional por segundo valor

+2

Tenga en cuenta que esto es realmente una matriz de matrices, no una matriz de 2 dimensiones. – Phrogz

+0

posible duplicado de [Ordene una colección de objetos por número (el más alto primero) luego por letra (alfabéticamente)] (http://stackoverflow.com/questions/2232470/sort-a-collection-of-objects-by-number- primero-primero-luego-por-letra-alfabético) –

Respuesta

33
arr = [[:z,1], [:d,3], [:e,2]] 
arr.sort {|a,b| a[1] <=> b[1]} 
# => [[:z, 1], [:e, 2], [:d, 3]] 

O como usuario Puntos @Phrogz a cabo, si las matrices internas tienen exactamente dos elementos cada uno:

arr.sort_by{|x,y|y} # => [[:z, 1], [:e, 2], [:d, 3]] 
arr.sort_by(&:last) # => [[:z, 1], [:e, 2], [:d, 3]] 
+12

O más simplemente: 'arr.sort_by {| s, n | n} 'o incluso' arr.sort_by (&: last) '(en Ruby 1.9). – Phrogz

+1

'arr.sort_by (&: last)' funciona en Ruby 1.8.7 también. –

+0

@Phrogz Prefiero 'sort' porque en ruby ​​2.4 (desde 2.0 de hecho o incluso antes)' sort_by' no existe, pero solo 'sort_by!' Y el [doc] (https://ruby-doc.org/ core-2.4.0/Array.html # method-i-sort_by-21) dice que: _El resultado no está garantizado como estable. Cuando dos teclas son iguales, el orden de los elementos correspondientes es impredecible. Por lo tanto, para usar 'sort_by!' Debe tener claves uniq. So @maerics edite su publicación para decir eso o elimine 'sort_by'. – noraj

0

Como maerics usuario responderla ofrece respuesta ascendente sorting.This es muy útil para mí, gracias. Para la clasificación descendente yo uso -

arr = [[:z,1], [:d,3], [:e,2]] 
arr.sort {|a,b| a[1] <=> b[1]}.reverse 
#=> [[:d, 3], [:e, 2], [:z, 1]] 
+0

Puede guardar la llamada "inversa" simplemente haciendo 'arr.sort {| a, b || b [1] <=> a [1]} '(observe el orden inverso de los operandos del operador de comparación). – maerics

+1

tiene un error tipográfico en su código, el código correcto es 'arr.sort {| a, b | b [1] <=> a [1]} '. ha insertado demasiado un personaje de pipa – Fred

Cuestiones relacionadas