【问题标题】:How to sort hash keys by their value in ruby 2.3.0如何在 ruby​​ 2.3.0 中按值对哈希键进行排序
【发布时间】:2023-03-16 14:22:01
【问题描述】:

我有这个数组:

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 } 之类的操作,但每当我运行时,我都会按原始顺序接收哈希键。

【问题讨论】:

  • 很难以编程方式执行,因为您有重复的键。否则,类似于 data.to_h.map { |k,v| v }.sort.map { |vv| {h.key(vv) => vv} } 会起作用。
  • 当你的值相同时会发生什么?
  • 是的...为清楚起见,data.to_h.map { |k,v| v }.sort.map { |vv| {h.key(vv) => vv} } 将起作用,除了 values 重复,而不是键。

标签: arrays ruby sorting hash


【解决方案1】:

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

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.

【讨论】:

  • 很高兴知道,谢谢!通过执行 -- hash = data.sort_by { |keys, values| values }.to_h 它也将它们排序为正确的顺序。谢谢你。这很有帮助!
  • 这不是被问到的......问题是如何按值对键进行排序。
【解决方案2】:

另外,

如何在 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 键排序,如果我们愿意的话。

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 2011-02-02
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多