Ruby 使用键的值对哈希进行排序

Ruby 使用键的值对哈希进行排序,ruby,Ruby,我有这样一个杂凑: a = { 29 => 3, 14 => 6, 13 => 2, 32 => 10 } 我想根据那里的值对这个散列进行排序,即:3,6,2,10 我可以做a.values.sort 但它只返回排序值的数组。我想对实际的散列进行排序,因此它应该返回一个新的散列(或者理想情况下使用已排序的散列更新原始散列),其中包含所有相同的键值对,但已排序 这适用于Ruby 1.9: a = { 29 => 3, 14 => 6, 13 => 2,

我有这样一个杂凑:

a = { 29 => 3, 14 => 6, 13 => 2, 32 => 10 }
我想根据那里的值对这个散列进行排序,即:3,6,2,10

我可以做
a.values.sort


但它只返回排序值的数组。我想对实际的散列进行排序,因此它应该返回一个新的散列(或者理想情况下使用已排序的散列更新原始散列),其中包含所有相同的键值对,但已排序

这适用于Ruby 1.9:

a = { 29 => 3, 14 => 6, 13 => 2, 32 => 10 }
p Hash[a.sort_by{|k,v| v}]
#=> {13=>2, 29=>3, 14=>6, 32=>10}
Ruby(1.9之前)中的散列是未排序的。您不能“返回排序了相同键值对的新哈希”,因为哈希实现根本不会对条目进行排序。您有两个选择:

  • 使用ActiveSupport::OrderedHash的实例(来自active\u support gem)
  • 使用排序对数组执行需要排序输入的任何操作。通过将该数组传递给哈希构造函数(Hash.new或Hash[]),将其转换回哈希

  • 很酷,但他希望它按值排序:
    Hash[a.invert.sort].invert
    yes Abe Voelker。。这就是答案!a、 将swtiches键值反转为values key,然后对它们进行排序,然后将它们切换回原来的位置!太棒了:德斯汀。。。那更好!:D thnx
    sort\u by
    inverst
    ing两次要好得多。太好了,谢谢!。花了一些时间寻找答案。几乎所有答案都是关于Ruby1.8.7的,这是针对1.9及以上版本的。