如何在Rails中对哈希进行排序

8

我有一个哈希表

x= {
  "1"=>{:name=>"test1", :age=>"1"}, 
  "5"=>{:name=>"test2", :age=>"5"}, 
  "2"=>{:name=>"test3", :age=>"2"}, 
  "4"=>{:name=>"test4", :adn=>"4"}, 
  "3"=>{:name=>"test5", :adn=>"3"}
 }

期望的输出

x= {
  "1"=>{:name=>"test1", :age=>"1"}, 
  "2"=>{:name=>"test3", :age=>"2"}, 
  "3"=>{:name=>"test5", :age=>"3"}, 
  "4"=>{:name=>"test4", :adn=>"4"}, 
  "5"=>{:name=>"test2", :adn=>"5"}
 }

到目前为止,我尝试了 x.sort.flatten ,但是我得到了:

[
  "1", {:name=>"test1", :age=>"1"}, 
  "2", {:name=>"test3", :age=>"2"}, 
  "3", {:name=>"test5", :adn=>"3"}, 
  "4", {:name=>"test4", :adn=>"4"}, 
  "5", {:name=>"test2", :age=>"5"}
]
3个回答

3

我认为直接对哈希进行排序是不可能的。可以将其转换为已排序的数组,然后再转回哈希:

x.sort_by{ |key,_| key.to_i }.to_h

它输出:

=> {"1"=>{:name=>"test1", :age=>"1"},
 "2"=>{:name=>"test3", :age=>"2"},
 "3"=>{:name=>"test5", :adn=>"3"},
 "4"=>{:name=>"test4", :adn=>"4"},
 "5"=>{:name=>"test2", :age=>"5"}}

如果您想按年龄排序:
x.sort_by{|k,v| v[:age].to_i}.to_h

如果你想按年龄或者 adn(如果这不是一个打字错误的话)进行排序:

x.sort_by{|k,v| ( v[:age] || v[:adn] ).to_i}.to_h

1
从你今天发布的另一个答案中借鉴你的想法:x.sort_by { |k,_| k.to_i }会更好,不是吗? - Sagar Pandya
我没有注意到键也是一个字符串。谢谢。 - Eric Duminil

2
你已经接近成功了,只需将flatten替换为to_h即可。
x.sort.to_h
# => {"1"=>{:name=>"test1", :age=>"1"}, "2"=>{:name=>"test3", :age=>"2"}, "3"=>{:name=>"test5", :adn=>"3"}, "4"=>{:name=>"test4", :adn=>"4"}, "5"=>{:name=>"test2", :age=>"5"}} 

可在 Ruby 2.1.8 中使用


请注意,键是字符串,不会像整数一样排序。 - Eric Duminil

1
这里有其他几种实现方式。
x.keys.sort_by(&:to_i).each_with_object({}) { |k,h| h[k] = x[k] }
  #=> {"1"=>{:name=>"test1", :age=>"1"},
  #    "2"=>{:name=>"test3", :age=>"2"},
  #    "3"=>{:name=>"test5", :adn=>"3"},
  #    "4"=>{:name=>"test4", :adn=>"4"},
  #    "5"=>{:name=>"test2", :age=>"5"}} 

或者

k = x.keys.sort_by(&:to_i)
k.zip(x.values_at(*k)).to_h

如果要修改x
x.keys.sort_by(&:to_i).each { |k| x[k] = x.delete(k) }
x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接