【问题标题】:What's a clean way to sort a hash in Ruby without returning an array of key-value pair arrays?什么是在 Ruby 中对哈希进行排序而不返回键值对数组数组的干净方法?
【发布时间】:2024-01-22 18:35:01
【问题描述】:

当我在 Ruby 中对哈希进行排序时,它会返回一个键值对数组的数组。

我希望它返回一个哈希值。

有什么干净的方法可以做到这一点?注入?

【问题讨论】:

    标签: ruby sorting hash inject


    【解决方案1】:

    哈希并不是真正可排序的对象。从 Ruby 1.9 开始,它们按照添加的顺序维护键,这很方便,但就数据结构而言,顺序无关紧要。

    您可以通过比较 { a: 1, b: 2 } == { b: 2, a: 1 } #=> true 来测试这一点。数组的情况并非如此,其中顺序是一个重要特征。

    您会发现 Ruby 中的许多方法实际上将哈希转换为可枚举,它们更接近于数组,因为它们具有定义的顺序。当从sort 之类的东西返回一个值时,你会得到一个数组。

    您可以使用Hash[...] 轻松地将其转换回哈希:

    Hash[hash.sort(...)]
    

    【讨论】:

    • Hash[...] 或者 Ruby 2.1 方法 Array#to_h。
    【解决方案2】:

    您可以使用Hash#[]

    h = {a: 1, b:0, c: 3}
    arr = h.sort {|(_,v),(_, v2) | v <=> v2 }
    h2 = Hash[arr] #=> {:b=>0, :a=>1, :c=>3}
    

    请注意,这是可能的,因为哈希是根据 Ruby 中的插入顺序枚举的。其他语言中的哈希通常不是这种情况

    【讨论】:

      【解决方案3】:

      正如其他人所警告的那样,依赖散列元素的顺序通常不是一个好习惯。

      假设您要对值进行排序,这里有另一种方法:

      h = {a: 2, b: 1, c: 4, d: 0}
      
      Hash[h.to_a.sort_by(&:last)]
       # => {:d=>0, :b=>1, :a=>2, :c=>4} 
      

      【讨论】:

        【解决方案4】:

        如果您想拥有一个本质上按其键排序的关联数组(而不是像其他建议的解决方案那样必须以正确的顺序手动插入),您应该查看实现的 RBTree gem一棵红黑树。

        【讨论】:

          最近更新 更多