2014-11-23 4 views
0

해시에서 요소를 교환하는 방법은 무엇입니까? I 이런 식으로 변경하려는루비, 반복 목적을 위해 해시에 요소를 교환하십시오.

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], } 

하나와 두 교환되었으며, 두 키의 값이

예 I이 해시가 그것도 중요합니다.

어떤 방법이 있습니까? 대단히 감사합니다.

EDIT : #each 메서드로 해시를 반복하고 싶습니다. 먼저 반복 될 키가 중요합니다. 첫 번째 해시를 의미합니다. 첫 번째 키는 1 번 반복되지만 두 번째 키는 스왑 된 후 2 번 키가 먼저 반복됩니다.

+0

이 지정하는 문제이다. –

답변

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]} 
+1

정말 고마워요 !! 이것으로 해결했습니다. – LuminaChen

1

을 당신이 오름차순으로 해시 값을 정렬 할 생각합니다.

[10,20,30], [100,200,300] and [1000, 2000,3000] 

그럼 내가 아래의 방법으로 당신을 제안 할 경우에는 다음과 같이

Hash[my_hash.sort { |x,y| x[1] <=> y[1] }] 
+1

똑같은 것을 쓰는 더 짧은 방법은'Hash [my_hash.sort_by (& : last)]' –

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]} 
관련 문제