Ruby,用于迭代目的的哈希交换元素

时间:2014-11-23 12:44:07

标签: ruby loops hash element swap

如何在哈希中交换元素?

示例我有这个哈希:

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将首先迭代。

3 个答案:

答案 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]}