0

我正在使用 Sphinx 返回一个方面的哈希值。返回的哈希是这样的:

{:brand=>{"C Brand"=>170, "A Brand"=>17, "B Brand"=>160}, :store=>{"B Store"=>95, "C Store"=>1, "A Store"=>9}}

哈希包含商店/品牌的名称,以及与之关联的产品数量。我需要按商店/品牌名称对哈希中的值进行排序,如下所示:

{:brand=>{"A Brand"=>170, "B Brand"=>17, "C Brand"=>160}, :store=>{"A Store"=>9, "B Store"=>95, "C Store"=>1}}

我已经阅读了很多关于排序哈希的内容,但我似乎无法找到正确的工作方法。

我正在运行 ruby​​ 1.8.7。

4

5 回答 5

2

要在 Ruby 1.9 中按其键对哈希进行排序,请执行以下操作:

sorted_hash = Hash[unsorted_hash.sort]

由于您使用的是 Ruby 1.8.7,因此您必须执行以下操作:

sorted_array_of_pairs = unsorted_hash.sort

或者只是在需要迭代时对其进行排序:

unsorted_hash.sort.each do |k, v|
   # ...
end
于 2012-03-19T21:15:08.037 回答
1

我猜您的预期结果有误,应该是{:brand=>{"A Brand"=>17, "B Brand"=>160, "C Brand"=>170}, :store=>{"A Store"=>9, "B Store"=>95, "C Store"=>1}}

关于代码:

a = {:brand=>{"C Brand"=>170, "A Brand"=>17, "B Brand"=>160}, :store=>{"B Store"=>95, "C Store"=>1, "A Store"=>9}}
a.each {|k,v| a[k] = Hash[v.sort]}
于 2012-03-19T21:18:52.197 回答
0
h = {:brand=>{"C Brand"=>170, "A Brand"=>17, "B Brand"=>160}, :store=>{"B Store"=>95, "C Store"=>1, "A Store"=>9}}
h.each{|k,v| h[k] = Hash[v.sort]}

你需要 Ruby 1.9 才能工作。

于 2012-03-19T21:13:54.060 回答
0

如果您的哈希不是太大,并且性能不是真正的问题,您仍然可以将哈希转换为数组,对数组进行排序,然后将其转换回哈希(或者 OrderedHash 是您使用的 ruby​​ < 1.9) . 这有点幼稚,但至少你可以继续前进,专注于其他事情,然后当它成为问题时再回来。

于 2012-03-19T21:12:31.377 回答
0

谢谢大家,最后我去了...

hash.map{ |key,values| [ key, values.sort_by {|x| x.to_s.sort} ] }

之所以需要,.to_s是因为某些品牌/商店名称是空字符串,它可以对整数进行排序。

于 2012-03-21T17:51:36.423 回答