我如何比较两个哈希值? [英] How do I compare two hashes?
本文介绍了我如何比较两个哈希值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
#!/ usr / bin / env ruby $ 使用下面的代码来比较两个Ruby Hashes: b
$ b需要yaml
需要active_support
file1 = YAML :: load(File.open('./ en_20110207.yml'))
file2 = YAML :: load(File.open('./ locales / en.yml'))
arr = []
file1.select {| k, v |
file2.select {| k2,v2 |
arr<< #{v2}如果#{v}!=#{v2}
}
}
放置
屏幕的输出是来自file2的完整文件。我知道一个事实,即文件是不同的,但脚本似乎没有把它拿起来。 你可以直接比较哈希值是否相等:
hash1 = {'a'=> 1,'b'=> 2}
hash2 = {'a'=> 1,'b'=> 2}
hash3 = {'a'=> 1,'b'=> 2,'c'=> 3}
hash1 == hash2#=> true
hash1 == hash3#=> false
hash1.to_a == hash2.to_a#=> true
hash1.to_a == hash3.to_a#=>假
<您可以将散列转换为数组,然后获得它们的区别:
hash3.to_a - hash1.to_a#=> [[c,3]]
if(hash3.size> hash1.size)
difference = hash3.to_a - hash1.to_a
else
difference = hash1.to_a - hash3.to_a
end
Hash [* difference.flatten]#=> {c=> 3}
简化进一步:
通过三元结构分配差异:
差值= (hash3.size> hash1.size)\
? hash3.to_a - hash1.to_a \
:hash1.to_a - hash3.to_a
=> [[c,3]]
散列[* difference.flatten]
=> {c=> 3}
在一个操作中完成所有操作, code $>变量:
Hash [*(
(hash3。 hash1.to_a - hash3.to_a
).flatten]
=> ;. {c=> 3}
I am trying to compare two Ruby Hashes using the following code:
#!/usr/bin/env ruby
require "yaml"
require "active_support"
file1 = YAML::load(File.open('./en_20110207.yml'))
file2 = YAML::load(File.open('./locales/en.yml'))
arr = []
file1.select { |k,v|
file2.select { |k2, v2|
arr << "#{v2}" if "#{v}" != "#{v2}"
}
}
puts arr
The output to the screen is the full file from file2. I know for a fact that the files are different, but the script doesn't seem to pick it up.
解决方案
You can compare hashes directly for equality:
hash1 = {'a' => 1, 'b' => 2}
hash2 = {'a' => 1, 'b' => 2}
hash3 = {'a' => 1, 'b' => 2, 'c' => 3}
hash1 == hash2 # => true
hash1 == hash3 # => false
hash1.to_a == hash2.to_a # => true
hash1.to_a == hash3.to_a # => false
You can convert the hashes to arrays, then get their difference:
hash3.to_a - hash1.to_a # => [["c", 3]]
if (hash3.size > hash1.size)
difference = hash3.to_a - hash1.to_a
else
difference = hash1.to_a - hash3.to_a
end
Hash[*difference.flatten] # => {"c"=>3}
Simplifying further:
Assigning difference via a ternary structure:
difference = (hash3.size > hash1.size) \
? hash3.to_a - hash1.to_a \
: hash1.to_a - hash3.to_a
=> [["c", 3]]
Hash[*difference.flatten]
=> {"c"=>3}
Doing it all in one operation and getting rid of the difference
variable:
Hash[*(
(hash3.size > hash1.size) \
? hash3.to_a - hash1.to_a \
: hash1.to_a - hash3.to_a
).flatten]
=> {"c"=>3}
这篇关于我如何比较两个哈希值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文