Можно ли сортировать хэш по ключам или значениям? - PullRequest
1 голос
/ 31 мая 2019

Можно ли отсортировать хэш по ключу или по значению в следующем коде:

myhash.each_key do |key| 
   print myhash[key], "\t:\t", key, "\n" 
end

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Сортировка по ключам:

myhash = {5 => "five", 3 => "three", 2 => "two", 4 => "four", 1 => "one"}

myhash.keys.sort.each do |key| 
  print myhash[key], "\t:\t", key, "\n" 
end

производит

one     :   1
two     :   2
three   :   3
four    :   4
five    :   5

Сортировка по значению немного сложнее:

myhash.to_a.sort { |item1, item2| item1[1] <=> item2[1] }.each do |item|
  puts item.join("\t:\t")
end

1010 * производит *

5   :   five
4   :   four
1   :   one
3   :   three
2   :   two

Если вы хотите, чтобы результаты в значении: порядок ключей, измените

puts item.join("\t:\t")

до

puts item.reverse.join("\t:\t")
1 голос
/ 03 июня 2019

Поскольку Crystal Hash сохраняет порядок вставки, на самом деле можно выполнить сортировку Hash:

myhash.to_a.sort.to_h

Для сортировки по значениям

myhash.to_a.sort_by { |k, v| v }.to_h

Для сортировкина месте, это немного громоздче:

myhash = {5 => "five", 3 => "three", 2 => "two", 4 => "four", 1 => "one"}

entries = myhash.to_a.sort
myhash.clear
entries.each { |k, v| myhash[k] = v }
...