如何按照ruby 2.3.0中的值对哈希键进行排序

时间:2016-03-24 00:01:39

标签: arrays ruby sorting hash

我有这个数组:

data = [
  ['Frank', 33],
  ['Stacy', 15],
  ['Juan', 24],
  ['Dom', 32],
  ['Steve', 24],
  ['Jill', 24]
]

我把它变成了一个哈希,这样我就可以用键和值来组织它,这样它们就可以更容易地单独调用。最终给了我这个

{"Frank"=>33, "Stacy"=>15, "Juan"=>24, "Dom"=>32, "Steve"=>24, "Jill"=>24}

我知道为了只看到我需要做的密钥data.keys而且通过执行data.keys.sort我按字母顺序获取密钥。

我认为我需要做data.keys.sort_by { |key, value| value }这样的事情,但每当我运行时,我都会按原始顺序接收哈希键。

2 个答案:

答案 0 :(得分:2)

您无法更改哈希的顺序,但您可以在将数组转换为哈希值之前对其进行排序:

data = [
  ['Frank', 33],
  ['Stacy', 15],
  ['Juan', 24],
  ['Dom', 32],
  ['Steve', 24],
  ['Jill', 24]
]

hash = data.sort_by(&:last).to_h
# => { "Stacy" => 15,
#      "Juan" => 24,
#      "Steve" => 24,
#      "Jill" => 24,
#      "Dom" => 32,
#      "Frank" => 33 }

如果您已经有哈希,那么您必须将其转换为数组,然后对其进行排序,然后将其转换为哈希值,例如: hash.to_a.sort_by(&:last).to_h

答案 1 :(得分:1)

此外,

  

如何按照ruby 2.3.0中的值对哈希键进行排序?

如果您有像

这样的哈希值
hash = {"Frank"=>33, "Stacy"=>15, "Juan"=>24, "Dom"=>32, "Steve"=>24, "Jill"=>24}

然后,哈希可以简单地按keysvalues排序,但这会给你arrayarrays,但可以转换为哈希。

hash.sort_by{|x,y| y}.to_h
# => {"Stacy"=>15, "Juan"=>24, "Steve"=>24, "Jill"=>24, "Dom"=>32, "Frank"=>33}

对于嵌套哈希

people = {
  :fred => { :name => "Fred", :age => 23 },
  :joan => { :name => "Joan", :age => 18 },
  :pete => { :name => "Pete", :age => 54 }
}

people.sort_by { |k, v| v[:age] }
# => [[:joan, {:name=>"Joan", :age=>18}],
#     [:fred, {:name=>"Fred", :age=>23}],
#     [:pete, {:name=>"Pete", :age=>54}]]

通过这种方式,我们甚至可以通过:name键进行排序,如果我们这样选择的话。