我正在发送需要按其值排序的嵌套散列。例如:按照它们的值对嵌套散列中的项目进行排序
@foo = {"a"=>{"z"=>5, "y"=>3, "x"=>88}, "b"=>{"a"=>2, "d"=>-5}}
当运行以下:
@foo["a"].sort{|a,b| a[1]<=>b[1]}
我得到:
[["y", 3], ["z", 5], ["x", 88]]
这是伟大的,它正是我想要的。问题是我并不总是知道发送给我的所有密钥是什么,所以我需要某种循环。我试图做到以下几点:
@foo.each do |e|
e.sort{|a,b| a[1]<=>b[1]}
end
这对我来说是有道理的,因为如果我手动调用@ foo.first [0]我得到
"a"
和@ foo.first [1]返回
{"z"=>5, "y"=>3, "x"=>8}
但由于某种原因,这是不正确排序(如所有)。我认为这是因为每个对整个哈希对象进行排序而不是对“a”的值进行排序。如何在不知道关键是什么的情况下访问嵌套哈希的值?
1)从概念上讲,最好使用Enumerable#sort_by来代替排序,请检查Phrogz的答案。 2)这使得就地操作,创建新的对象(功能方法)使代码更容易遵循。 – tokland 2011-02-07 20:18:27
@tokland - 所有要点,但我的目标是遵循OP代码,同时仍然解决实际问题。虽然创建新对象可能更容易遵循,但如果要将其分配回原始,则不会创建临时变量。 – 2011-02-07 20:33:35