1

有人对我如何将哈希中的值重新映射到不同的键有 Ruby 建议吗?说我有这个

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

并且想要得到这个(即,“present”、“first”和“subject”、“second”的值已被切换):

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

我想在一个大数据集上做到这一点。

4

5 回答 5

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}
于 2011-08-04T12:45:57.247 回答
2

你没有提供足够的上下文,但你可以做类似的事情

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

编辑:from.values_rearranged_in_any_way_you_like应该from.values按照您需要的方式进行排序(我假设您确实有一种想要的方式来对它们进行排序以进行重新排列)。

于 2011-08-04T08:00:02.933 回答
0

你可以这样做:

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

那么你可以交换'values'数组(或'keys'数组)的条目

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

...

或者如果您只想将 em 上移一项:

values.rotate (ruby 1.9)

您还可以执行 push/pop、shift/unshift 操作或对值进行排序要创建哈希,请执行以下操作:

hsh = Hash.new
keys.size.times do |i|
  hsh[ keys[i] ] = values[i]
end
于 2011-08-04T07:25:08.010 回答
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
于 2011-08-04T07:29:21.003 回答
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}

不过,不确定您是否应该在 ruby​​ 中重新映射巨大的哈希值。

于 2011-08-04T11:54:35.570 回答