Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 当一个散列的值相等时,将其替换为第二个散列的键_Ruby_Hash_Comparison - Fatal编程技术网

Ruby 当一个散列的值相等时,将其替换为第二个散列的键

Ruby 当一个散列的值相等时,将其替换为第二个散列的键,ruby,hash,comparison,Ruby,Hash,Comparison,红宝石大师的长期鉴赏者第一次提问 我有两个散列 hash1 = {"a" =>1, "b"=> 2, "c" => 3} hash2 = {"f" =>1, "g"=> 2, "h" => 3, "i"=>2, "j"=>1} 当第二个散列的值相等时,我想用第一个散列的键替换第二个散列的值,例如: hash2 = {"f"=>"a", "g"=>"b", "h"=>"c", "i"=>"b", "j"=>"a"}

红宝石大师的长期鉴赏者第一次提问

我有两个散列

hash1 = {"a" =>1, "b"=> 2, "c" => 3}

hash2 = {"f" =>1, "g"=> 2, "h" => 3, "i"=>2, "j"=>1}
当第二个散列的值相等时,我想用第一个散列的键替换第二个散列的值,例如:

hash2 = {"f"=>"a", "g"=>"b", "h"=>"c", "i"=>"b", "j"=>"a"}
顺序一点也不重要

我会做如下工作:

hash1_inverted = hash1.invert
hash3 = hash2.map { |k, v| [k, hash1_inverted[v]] }.to_h
#=> {"f"=>"a", "g"=>"b", "h"=>"c", "i"=>"b", "j"=>"a"}
hash1 = {:a =>1, :b=> 2, :c => 3} 
hash2 = {:f =>1, :g=> 2, :h => 3, :i=>2, :j=>1}
hash2.each_with_object({}){|(k,v),h| h[k]=hash1.key(v)}
# => {:f=>:a, :g=>:b, :h=>:c, :i=>:b, :j=>:a}


那么,实现它有什么问题呢?当哈希值匹配时,如何比较哈希值并用哈希值1中的键替换哈希值2中的值?我不知道如何实现这一点。你到底为什么要这样做?它被用作脚本的一部分,用于查找存在于多个服务器上的IP。你救了我一天。非常感谢。请注意,您在每次迭代时都在搜索哈希1。@Stefan我遵循了这一点,我想在第二个哈希的值相等时,用第一个哈希的键替换第二个哈希的值。结果是正确的。但是,在循环hash2.map中基本上有一个循环hash1.key。对于大型散列,这可能会很慢。@Stefan我已经更新了…:感谢您的评论直到两个嵌套循环:设置两个哈希,每个哈希有100000个条目,并将您的解决方案与tokland的答案进行比较
hash1 = {:a =>1, :b=> 2, :c => 3} 
nw_hsh = hash1.invert
hash2 = {:f =>1, :g=> 2, :h => 3, :i=>2, :j=>1}
hash2.each_with_object({}){|(k,v),h| h[k]=nw_hsh[v]}
# => {:f=>:a, :g=>:b, :h=>:c, :i=>:b, :j=>:a}