有没有人有关于如何将哈希值中的值重新映射到不同键的Ruby建议?说我有这个
from => {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85}
并希望得到这个(即“现在”,“第一”和“主题”,“第二”的值已被切换):
to => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}
我想在大型数据集上执行此操作。
答案 0 :(得分: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}
答案 1 :(得分:2)
您没有提供足够的上下文,但您可以执行类似
的操作 to = Hash[from.keys.zip(from.values_rearranged_in_any_way_you_like)]
编辑:from.values_rearranged_in_any_way_you_like
应该按照您需要的方式排序from.values
(我假设您确实有一种方法可以对它们进行重新排序)。
答案 2 :(得分:0)
你可以这样做:
keys = @hash.keys
values = @hash.values
然后你可以交换'values'数组(或'keys'数组)的条目
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
答案 3 :(得分: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
答案 4 :(得分:0)
保持简单,使用merge:
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}
不确定你是否应该重新制作红宝石中的巨大哈希值。