2011-08-04 65 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

相关问题