2017-04-18 22 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への参照が2つあり、そのうちの1つをスワップしない限り、2番目のオプションは最初のオプションとほぼ同じです。

3番目のオプションは最も破壊的です。対の要素への参照はすべて変更されます。ただし、新しい配列が作成されないため、メモリー効率が最も高くなります。

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

このソリューションでは、すべての名前と値が一意であると想定しています。 –

関連する問題