Ruby中多个哈希的交集

时间:2014-12-27 00:29:24

标签: ruby

场景是这样的:我有一个目录,其中有多个JSON文件具有相似的数据,但不是完全相同的数据(结构相同,但数据可能不一定相同)。

我需要找到所有JSON文件之间相似的键(即所有JSON文件的交集)。

我像这样加载JSON文件

require 'json'

ARGV.each {|x|
    JSON.parse(File.read(x))
}

从这里开始,我不知道如何得到哈希的交集 我知道你可以使用套装,如此

require 'json'
require 'set'

ARGV.each {|x| 
    JSON.parse(File.read(x)).to_set
}.reduce(:&)

但是根据这篇文章Hashes Vs. Set Performace,哈希似乎更快(虽然我猜这取决于用例)

那么,我怎样才能找到多个哈希的交集(键值对是相同的),而不使用Set?

1 个答案:

答案 0 :(得分:1)

您不需要使用套装。集合维护所有元素都是唯一的,并且JSON哈希永远不会有两个相同的键值对。我只使用普通数组(to_a)。

一个问题是您实际上是在reduce(:&)上调用ARGV而不是解析的JSON。您可以将each更改为map以解决此问题:

ARGV.map { |x| 
  JSON.parse(File.read(x)).to_a
}.reduce(:&)

如果要将其转换回哈希表单,可以使用to_h