2011-08-04 66 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] 

...

或者如果您只想將其移動一個項目:

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

爲什麼不使用self [key1],self [key2] = self [key2],self [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

now THAT是一個不錯的方法,thx分享 – Markus1189

+0

謝謝。這是一個更大的問題的一部分,我被捲入這個重映射。我認爲這個解決方案會優雅地工作。真棒! – user877961

+1

@ user877961如果您不需要任何提示,您應該標記答案 – Markus1189

相關問題