2011-08-04 9 views
1

ハッシュ内の値を別のキーに再マップする方法について、Rubyのアドバイスがありますか?私はこのあるキーから別のキーへのルビ・ハッシュ・スワップの値

from => {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85} 

を持って取得したいと言う、この(すなわち、の値「現在」、「第一」と「件名」、「第二」に切り替えされています):私が欲しい

to => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30} 

大規模なデータセットでこれを実行します。

+0

私はあなたがリマップのアルゴリズムを持っていると推測しています。私の意見では、これを行う最良の方法はリマップ用のスクリプトを書くことです。私は本当にこの挑戦は表示されません –

+0

あなたはキースイッチのポリシーであるかを説明していません... – tokland

答えて

0

あなたはこのような何か行うことができます:...

keys = @hash.keys 
values = @hash.values 

、あなたは '値' 配列(または「キーの配列)のエントリを入れ替えることができ

values[0], values[4] = values[4], values[0] 

をまたは1つのアイテムだけをシフトしたい場合:

values.rotate (ruby 1.9) 

あなたもないプッシュ/ポップを実行し、シフト/アンシフト操作やハッシュを作成するには値 を並べ替えることができます。

hsh = Hash.new 
keys.size.times do |i| 
    hsh[ keys[i] ] = values[i] 
end 
0

をさて、ここでは簡単な少しアルゴリズムです。私はそれがいかに効率的であるかはわかりませんが、うまくいくはずです。

class Hash 
    def swap_vals!(new_key_maps) 
     new_key_maps.each do |key1, key2| 
      temp = self[key1] 
      self[key1] = self[key2] 
      self[key2] = temp 
     end 
    end 
end 
+0

自己[key1]、自己[key2] =自己[key2]、自己[key1] – Markus1189

2

あなたは十分なコンテキストを提供していませんが、あなたは

to = Hash[from.keys.zip(from.values_rearranged_in_any_way_you_like)] 

編集のような何か行うことができます:from.values_rearranged_in_any_way_you_likeはあなたが必要な方法でfrom.valuesをソートすることになっている(私はあなたが持っていないと仮定しているが並べ替えのためにそれらを並べ替える望ましい方法)。

0

マージ使用し、それをシンプルに保つ:あなたががルビーで巨大なハッシュを再マッピングする必要があります

from => {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85} 
to => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30} 

from.merge(to) 
# => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30} 

わからないが。

3
# this is your starting hash: 
from = {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85} 
# this is your replacement mapping: 
map = {'present' => 'first', 'subject' => 'second'} 
# create complete map by inverting and merging back 
map.merge!(map.invert) 
# => {"present"=>"first", "subject"=>"second", "first"=>"present", "second"=>"subject"} 
# apply the mapping to the source hash: 
from.merge(map){|_, _, key| from[key]} 
# => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30} 
+0

が今THAT良い方法です、共有のためのthx – Markus1189

+0

ありがとうございます。これははるかに大きな問題の一部であり、私はこの再マッピングに巻き込まれていました。私はこのソリューションがエレガントに動作すると思います。驚くばかり! – user877961

+1

@ user877961これ以上のヒントが必要ない場合は、回答にマークを付ける必要があります – Markus1189

関連する問題