2

我试图按值对特定哈希进行排序。我遇到了一种使用方法的方法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失去了整个目的。IE:

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 红宝石

4

3 回答 3

1

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

来源:Ruby 1.8.7 文档

  • 哈希保持顺序。它列举了它的元素

来源:Ruby 1.9.1 变更日志

如果你想在 Ruby 1.8 中使用有序哈希,你应该看看 ActiveSupport 的OrderedHash

您不需要在 Rails 项目中,只需在项目中包含 ActiveSupport。

于 2013-04-19T11:32:14.970 回答
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。

于 2013-04-19T11:52:39.927 回答
-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)]

看到你的编辑后 你正在使用一个没有有序哈希的版本。您无法控制元素的顺序。你不能用它做任何事情。

于 2013-04-19T11:11:30.027 回答