【问题标题】:How do I iterate over a hash by ascending value?如何通过升值来迭代哈希?
【发布时间】:2017-07-29 17:17:26
【问题描述】:

我使用的是 Ruby 2.4。我有一个哈希,它的键是一个字符串,它的值是一个数字(一个正整数)。我像这样迭代对

  my_hash.each do |key, value|

我的问题是,我如何迭代我的哈希,其中每对按升序排序?也就是说,如果我的哈希是

{"a" => 2, "b" => 4, "c" => 1}

"c" => 1 对将首先被迭代,然后是 "a" => 2,然后是 "b" => 4。

【问题讨论】:

    标签: ruby hash iterator


    【解决方案1】:

    您可以先对哈希的键值对进行排序,然后对其进行迭代。

    my_hash.sort_by { |_, value| value }.each { |key, value| puts key }
    

    如果my_hash = {"a" => 2, "b" => 4, "c" => 1},则输出为:

    c
    一个
    b


    根据建议,您可以使用Array#last实例方法来简化。

    my_hash.sort_by(&:last).each { |key, value| puts key }
    

    可枚举#sort_by

    ​​>

    有关文档,请参阅 Enumerable#sort_by

    通过每个键值对调用传递给sort_by 的块。 sort_by 的结果是一个嵌套数组。

    使用上面的例子:

    p my_hash.sort_by(&:last)
    

    [["c", 1], ["a", 2], ["b", 4]]

    【讨论】:

    • Hash#sort_by 使用两个元素数组(您正在解构)调用该块,因此您可以根据需要说 my_hash.sort_by(&:last)
    • @muistooshort,你不是说Enumerable#sort_by吗? Hash 类没有该名称的实例方法。 Justin,“您可以先对哈希进行排序,..”可能被解释为表示排序产生另一个哈希,其中键值对重新排序。更清楚地说,您正在对散列的键值对进行排序,生成一个由二元素数组组成的数组。
    • @CarySwoveland 当然,这样会更准确。我试图简化我的说法,即所有 Enumerable 方法在 Hash 上使用时都会将两个元素数组发送到块。可能不是我最好的英语用法:)
    • @muistooshort,当我看到Hash#sort_by 时,我想到了Hash#select,它与Enumerable#select 不同,它返回一个哈希值(而不是一个数组)。
    • 使用last 更好,谢谢!我还编辑了答案,以更清楚地了解 sort_by 的工作原理。
    【解决方案2】:

    在 Ruby 2.7 中,您可以numbered block parameters 以更短的方式引用您的哈希键或哈希值。如果您需要,例如有用转换为字符串:

    my_hash.sort_by { _1.to_s }.each {|key, value| puts key }
    

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 2019-06-03
      相关资源
      最近更新 更多