Hash 可以按键或值排序吗?

Can Hash be sorted by keys or values?

是否可以在以下代码中按键或按值对 Hash 进行排序:

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

按键排序:

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

产生

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

如果您想要 value:key 顺序的结果,请更改

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

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

由于 Crystal Hash 保留了插入顺序,因此实际上可以进行排序 Hash:

myhash.to_a.sort.to_h

要按值排序,

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

要排序 in-place,它有点笨重:

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 }