我试图按值对特定哈希进行排序。我使用方法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红宝石答案 0 :(得分:1)
哈希是键值对的集合。它类似于数组, 除了索引是通过任何对象类型的任意键完成的, 不是整数索引。 您通过任一方式遍历哈希的顺序 键或值可能看似随意,并且通常不会出现在 插入顺序。
- 哈希保留订单。它列举了
中的元素
如果你想在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)]
看到您的修改后 您正在使用没有有序哈希的版本。您无法控制元素的顺序。你无法做任何事情。