如何在哈希中交换元素?
示例我有这个哈希:
my_hash = { 1 => [100,200,300], 2 => [10, 20, 30], 3 => [1000, 2000, 3000], }
我想把它改成这样:
my_hash = { 2 => [10, 20, 30], 1 => [100,200,300], 3 => [1000, 2000, 3000], }
例如,元素一和二已被交换,两个键的值也都跟着它的键。
有什么办法吗?非常感谢你
编辑:我想用#each方法迭代哈希,首先迭代的密钥很重要。我的意思是第一个哈希,键1将首先迭代,但在交换后(第二个),键2将首先迭代。答案 0 :(得分:1)
我认为您希望按升序对哈希值进行排序。
[10,20,30], [100,200,300] and [1000, 2000,3000]
如果是,那么我建议你采用以下方式
Hash[my_hash.sort { |x,y| x[1] <=> y[1] }]
答案 1 :(得分:0)
你可以这样做:
a = my_hash.to_a
a[0], a[1] = a[1], a[0]
Hash[a] # => {2 => [10, 20, 30], 1 => [100,200,300], 3 => [1000, 2000, 3000]}
答案 2 :(得分:0)
你可以这样做。请注意,在Ruby 1.9之前,没有散列元素顺序的概念。
def reorder_hash(hash, key_order)
Hash[key_order.zip(hash.values_at(*key_order))]
end
my_hash = {a: [100,200,300], b: [10,20,30], c: [1000,2000,3000]}
reorder_hash(my_hash, [:b, :a, :c])
#=> {b: [10,20,30], a: [100,200,300], c: [1000,2000,3000]}
reorder_hash(my_hash, my_hash.keys.reverse)
#=> {c: [1000,2000,3000], b: [10,20,30], a: [100,200,300]}
您可以添加:
def swap_hash_pairs(hash, k1, k2)
keys = hash.keys
i1, i2 = keys.index(k1), keys.index(k2)
keys[i1], keys[i2] = keys[i2], keys[i1]
reorder_hash(hash, keys)
end
swap_hash_pairs(my_hash, :a, :b)
#=> {b: [10,20,30], a: [100,200,300], c: [1000,2000,3000]}
swap_hash_pairs(my_hash, :a, :c)
#=> {c: [1000,2000,3000], b: [10,20,30], a: [100,200,300]}