2017-04-18 3 views

답변

5

다양한 옵션 (짧은 손 설탕 다음 각 버전) :

# Create a new array of swapped elements 
my_array = my_array.map{ |a| a.reverse } 
my_array = my_array.map(&:reverse) 

# Mutate the existing array with swapped elements 
my_array.map!{ |a| a.reverse } 
my_array.map!(&:reverse) 

# Mutate the elements in the existing array 
my_array.each{ |a| a.reverse! } 
my_array.each(&:reverse!) 

첫 번째 옵션 인 기존 배열이 경우에 (수정되지 않습니다으로 '안전'한, 당신은 그들에게 다른 참조가 있습니다 변경해서는 안됨).

두 번째 옵션은 my_array에 대한 참조가 두 개 있지 않고 한 개만 해제해야하는 경우가 아니라면 첫 번째 옵션과 대략 동일합니다.

세 번째 옵션은 가장 파괴적인 옵션입니다. pairwise 요소에 대한 모든 참조가 변경됩니다. 그러나 새로운 배열이 생성되지 않기 때문에 가장 메모리 효율적입니다.

2

그냥 재미로하는 대답 (루빅스 큐브와 같은 매트릭스를 회전) :

array = [[:name1, :value1], [:name2, :value2]] 
array.transpose # [[:name1, :name2], [:value1, :value2]] 
    .reverse # [[:value1, :value2], [:name1, :name2]] 
    .transpose 
#=> [[:value1, :name1], [:value2, :name2]] 

(같은 재미 있고 분명하지만, 여전히 불가능) 또 하나의 방법 :

array.inject(&:zip).reverse.inject(&:zip) 
#=> [[:value1, :name1], [:value2, :name2]] 
0

하나 더 방법은 사용하는 것입니다 to_hto_a :

array = [[:name1, :value2], [:name2, :value2]] 
array.to_h # {name1: :value1, name2: :value2} 
    .invert # {value1: :name1, value2: :name2} 
    .to_a # [[:value1, :name1], [:value2, :name2]] 
+0

이 솔루션은 모든 이름과 값이 고유 할 것으로 기대합니다. –

관련 문제