¿Cómo clasifico una matriz de hash por un valor en el hash?


120

Este código Ruby no se comporta como esperaba:

# create an array of hashes
sort_me = []
sort_me.push({"value"=>1, "name"=>"a"})
sort_me.push({"value"=>3, "name"=>"c"})
sort_me.push({"value"=>2, "name"=>"b"})

# sort
sort_me.sort_by { |k| k["value"]}

# same order as above!
puts sort_me

Estoy buscando ordenar la matriz de hashes por la clave "valor", pero se imprimen sin clasificar.

Respuestas:


215

Ruby sortno se clasifica en el lugar. (¿Tienes experiencia en Python, quizás?)

Ruby tiene sort!para la clasificación en el lugar, pero no hay una variante en el lugar para sort_byRuby 1.8. En la práctica, puede hacer:

sorted = sort_me.sort_by { |k| k["value"] }
puts sorted

A partir de Ruby 1.9+, .sort_by!está disponible para clasificación in situ:

sort_me.sort_by! { |k| k["value"]}

28
De hecho, Array#sort_by!es nuevo en Ruby 1.9.2. Disponible hoy para toda la versión Ruby requiriendo mi backportsgema también :-)
Marc-André Lafortune

Hola, ¿hay alguna forma de ordenar en orden descendente también? Supongo que podría querer ir 3,2,1...
tekknolagi

2
No puede hacer eso con sort_by, pero use sorto sort!y simplemente cambie los operandos: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
Stéphan Kochen

1
O:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz

9
@tekknolagi: Solo agregue .reverse.
Zaz

21

Según @shteef pero implementado con la sort!variante como se sugiere:

sort_me.sort! { |x, y| x["value"] <=> y["value"] }

7

Aunque Ruby no tiene una sort_byvariante local, puede hacer:

sort_me = sort_me.sort_by { |k| k["value"] }

Array.sort_by! fue agregado en 1.9.2


1
Esta respuesta "Array.sort_by! Se agregó en 1.9.2" funcionó para mí
web spider26 de

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.