按值排序哈希

时间:2013-04-19 11:05:22

标签: ruby-on-rails ruby

我试图按值对特定哈希进行排序。我使用方法sort_by找到了一种方法。但即使我在哈希上调用sort_by,它也会返回一个数组,即:

a = {}
a[0] = "c"
a[1] = "b"
a[2] = "a"
a.sort_by{|key, value| value}
# => [[2, "a"], [1, "b"], [0, "c"]]

如果我尝试将结果转换为哈希,我最终会得到一个按键排序的哈希,因此sort_by的整个目的都会丢失。即:

a = {}
a[0] = "c"
a[1] = "b"
a[2] = "a"
Hash[*a.sort_by{|key, value| value}.flatten]
# => {0=>"c", 1=>"b", 2=>"a"}

有没有办法可以按值对哈希进行排序,然后以哈希的形式返回结果?

编辑:我使用的是1.8.6红宝石

3 个答案:

答案 0 :(得分:1)

  

哈希是键值对的集合。它类似于数组,   除了索引是通过任何对象类型的任意键完成的,   不是整数索引。 您通过任一方式遍历哈希的顺序   键或值可能看似随意,并且通常不会出现在   插入顺序。

来源:Ruby 1.8.7 docs

  
      
  • 哈希保留订单。它列举了
  • 中的元素   

来源:Ruby 1.9.1 changelog

如果你想在ruby 1.8中使用有序哈希,你应该看一下有效支持OrderedHash(你不需要在Rails项目中,只需在项目中包含活动支持)

答案 1 :(得分:1)

您可以将ActiveSupport::OrderedHash用于Ruby 1.8:

  

ActiveSupport::OrderedHash实现了一个保留插入顺序的哈希,如Ruby 1.9

我没有1.8.6运行,但这应该有效:

a = {}
a[0] = "c"
a[1] = "b"
a[2] = "a"

ordered = ActiveSupport::OrderedHash[*a.sort_by{|k,v| v}.flatten]
ordered.keys
# => [2, 1, 0], this order is guaranteed

正如上面的引用中所述,Ruby 1.9 中的哈希值按照插入相应键的顺序枚举它们的值,因此只需要Ruby 1.8。

答案 2 :(得分:-2)

您的描述错误。

a = {}
a[0] = "c"
a[1] = "b"
a[2] = "a"
Hash[*a.sort_by{|key, value| value}.flatten]

给出:

{
  2 => "a",
  1 => "b",
  0 => "c"
}

按值排序。顺便说一下,你的代码是多余的。更好的方法是:

Hash[a.sort_by{|_, value| value}]

Hash[a.sort_by(&:last)]

看到您的修改后 您正在使用没有有序哈希的版本。您无法控制元素的顺序。你无法做任何事情。