我想对我的红宝石哈希进行排序。我的数据以下列方式出现
{"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"}
我想按照以下方式准备
{"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
最简单的方法是什么?
答案 0 :(得分:4)
以下是两种方法。
h = {"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"}
key_order = ["imp", "vis", "ctr", "ins"]
<强>#1 强>
Hash[key_order.map { |k| [k, h[k]] }]
#=> {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
或使用Ruby 2.1
key_order.map { |k| [k, h[k]] }.to_h
<强>#2 强>
Hash[key_order.zip(h.values_at(*key_order))]
#=> {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
以下是步骤:
a = h.values_at(*key_order)
#=> h.values_at(*["imp", "vis", "ctr", "ins"])
#=> h.values_at("imp", "vis", "ctr", "ins")
#=> ["116", "44", "0.08", "7.8"]
b = key_order.zip(a)
#=> ["imp", "vis", "ctr", "ins"].zip(["116", "44", "0.08", "7.8"])
#=> [["imp", "116"], ["vis", "44"], ["ctr", "0.08"], ["ins", "7.8"]]
Hash[b]
#=> {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
答案 1 :(得分:1)
为订单制作映射键可能是一个解决方案:
predefined_orders = ["imp", "vis", "ctr", "ins"]
orders = Hash[predefined_orders.each_with_index.to_a]
# => {"imp"=>0, "vis"=>1, "ctr"=>2, "ins"=>3}
h = {"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"}
Hash[h.sort_by { |x| orders[x[0]] }]
# => {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
h.sort_by { |x| orders[x[0]] }.to_h # Ruby 2.1+
# => {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
h = {"imp"=>"116", "ctr"=>"0.08", "vis"=>"44"}
Hash[h.sort_by { |x| orders[x[0]] }]
# => {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08"}