【问题标题】:Sort arrays that are Hash values对作为哈希值的数组进行排序
【发布时间】:2016-12-29 03:45:32
【问题描述】:

我有一个哈希,其中键是整数,值是字符串数组。然后我需要按字母顺序对数组中的项目进行排序,并将排序后的数组作为新的哈希值返回。

我认为像hash.map{ |k,v| v.sort } 这样的东西会起作用,但是,不行。为了更明确一点,我需要转:

hash = { 0 => ["c", "d", "b", "a"], 1 => ["e", "q", "x", "m"] }

进入:

hash = { 0 => ["a", "b", "c", "d"], 1 => ["e", "m", "q", "x"] }

【问题讨论】:

    标签: arrays ruby sorting hash


    【解决方案1】:

    这是一种方式:

     hash.each_value { |v| v.sort! }
     #=> {0=>["a", "b", "c", "d"], 1=>["e", "m", "q", "x"]} 
    

    或更简洁地说:

    hash.each_value(&:sort!)
    

    但是,如果您希望保留原始哈希,请执行以下操作:

    hash.map { |k,v| [k,v.sort] }.to_h
    #=> {0=>["a", "b", "c", "d"], 1=>["e", "m", "q", "x"]} 
    

    【讨论】:

    • 不错。从来不知道有一个each_value 方法。
    • 将此更改为接受的答案 b/c 彻底性。 #each_value(&:sort!) 可能是最红宝石的方式来做到这一点。谢谢。
    【解决方案2】:

    试试这个,

    hash.each { |k,v| v.sort! }
    

    这会对数组进行就地排序。

    【讨论】:

    • 我已经尝试过#each 方法,但我猜想排序的结果!是重要的一点。谢谢。
    【解决方案3】:

    这不会改变原始哈希。

    hash.merge(hash) { |*,n| n.sort }
      #=> {0=>["a", "b", "c", "d"], 1=>["e", "m", "q", "x"]}
    

    如果要修改原始哈希,请用merge!(又名update)替换merge

    这使用Hash#mergeHash#merge! 的形式,它们使用一个块来确定两个被合并散列中存在的键的值,这里是原始散列的所有键。有关详细信息,请参阅文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-22
      • 2017-12-13
      • 1970-01-01
      • 2020-04-05
      • 2019-04-25
      • 2015-04-08
      • 2011-03-10
      • 2012-01-21
      相关资源
      最近更新 更多