Saltar al contenido

Cómo ordenar un Ruby Hash alfabéticamente por keys

Agradecemos tu apoyo para compartir nuestros enunciados sobre las ciencias de la computación.

Solución:

Suponiendo que desea que la salida sea un hash que iterará a través de keys en orden ordenado, entonces estás casi allí. Hash#sort_by devuelve un Array de Arrays, y las matrices internas son todos dos elementos.

de rubí Hash tiene un constructor que puede consumir esta salida.

Prueba esto:

temp = Hash[ temp.sort_by   ]

o más concisamente

temp = temp.sort_by key.to_h

Si tu hachís tiene mixed key tipos, esto no funcionará (Ruby no ordenará automáticamente entre Stringarena Symbols por ejemplo) y obtendrá un mensaje de error como la comparación de Símbolo con Cadena falló (ArgumentError). Si es así, podría modificar lo anterior para

temp = Hash[ temp.sort_by  key.to_s  ] 

para solucionar el problema. Sin embargo, tenga cuidado de que el keys aún conservará sus tipos originales, lo que podría causar problemas con las suposiciones en el código posterior. Además, la mayoría de las clases integradas admiten un .to_s método, por lo que puede obtener resultados no deseados de eso (como un orden de clasificación inesperado para números keysu otros tipos inesperados).

Tú podrías, ademásconvertir el keys para Strings con algo como esto:

temp = Hash[ temp.map  [key.to_s, val] .sort ] 

. . . aunque este enfoque perdería información sobre el tipo de original key lo que hace imposible hacer referencia a los datos originales de forma fiable.

sorted_by_key = Hash[original_hash.sort]

creará un nuevo Hash insertando el key/valores de original_hash alfabéticamente por key. Los hashes de Ruby 2.x recuerdan su orden de inserción, por lo que este nuevo hash aparecerá ordenado por key si lo enumeras o lo envías.

Si inserta más elementos en un orden no alfabético, esto no se mantendrá, por supuesto.

Además, esto supone el hash original keys son todos clasificables/comparables.

Ruby’s Hash recuerda su orden de inserción ahora, pero los anteriores Rubies

Eso es diferente a un Array que actúa como un archivo secuencial/de texto o una cadena o una cola y tienes que acceder a él linealmente al iterarlo, en ese punto, el orden de los elementos hace una gran diferencia.

Entonces, con un Hash, obtén el keysordenarlos e iterar sobre la lista de keys o usar values_at para recuperar todos los valores a la vez. Por ejemplo:

hash = 
    'z' => 9,
    'a' => 1


sorted_keys = hash.keys.sort # => ["a", "z"]
sorted_keys.each do |k|
  puts hash[k]
end
# >> 1
# >> 9

hash.values_at(*sorted_keys) # => [1, 9]

Algunos idiomas ni siquiera le permitirán ordenar el hash y acceder a él a través de una lista ordenada de keys es la única forma de extraer los elementos en un orden, por lo que probablemente sea una buena idea no acostumbrarse a confiar en el orden de los keypares /valor, y en su lugar confiar en el keys.

Al final de todo puedes encontrar las referencias de otros gestores de proyectos, tú incluso tienes la opción de mostrar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *