簡體   English   中英

紅寶石哈希值從一個密鑰交換到另一個

[英]ruby hash swap values from one key to another

有人對我如何將哈希值重新映射到不同的鍵有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}

我想在大型數據集上執行此操作。

# 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}

您沒有提供足夠的上下文,但是可以做類似的事情

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

編輯: from.values_rearranged_in_any_way_you_like應該是from.values以您需要的方式排序(我假設您確實有一種希望的方式來對它們進行排序以進行重新排列)。

您可以執行以下操作:

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

那么您可以交換“值”數組(或“鍵”數組)的條目

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

...

或者,如果您只想將em上移一項:

values.rotate (ruby 1.9)

您還可以執行推/彈出,移位/取消移位操作或對值進行排序以創建哈希,請執行以下操作:

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

好吧,這是一個簡單的小算法。 我不知道它的效率如何,但是應該可以。

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

保持簡單,使用合並:

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}

不確定您是否應該在紅寶石中重新映射巨大的哈希值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM