【发布时间】:2024-01-22 18:35:01
【问题描述】:
当我在 Ruby 中对哈希进行排序时,它会返回一个键值对数组的数组。
我希望它返回一个哈希值。
有什么干净的方法可以做到这一点?注入?
【问题讨论】:
当我在 Ruby 中对哈希进行排序时,它会返回一个键值对数组的数组。
我希望它返回一个哈希值。
有什么干净的方法可以做到这一点?注入?
【问题讨论】:
哈希并不是真正可排序的对象。从 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。
您可以使用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 中的插入顺序枚举的。其他语言中的哈希通常不是这种情况
【讨论】:
正如其他人所警告的那样,依赖散列元素的顺序通常不是一个好习惯。
假设您要对值进行排序,这里有另一种方法:
h = {a: 2, b: 1, c: 4, d: 0}
Hash[h.to_a.sort_by(&:last)]
# => {:d=>0, :b=>1, :a=>2, :c=>4}
【讨论】:
如果您想拥有一个本质上按其键排序的关联数组(而不是像其他建议的解决方案那样必须以正确的顺序手动插入),您应该查看实现的 RBTree gem一棵红黑树。
【讨论】: