Ruby - 从修改后的值重构哈希

标签 ruby

我正在编写一个程序,它将扫描一个目录,获取文件中行的校验和,并将其与某个数据库进行比较,返回匹配的条目。

我的数据库是一个包含文件名及其行校验和的 json 文件,它看起来像这样:

"HASHES": {
   "file_name": {
     "1": "checksum",
     "2": "checksum"
   },
   "file_name": {
     "1": "checksum",
     "2": "checksum
   },
   etc..
}

然后我扫描一个目录并构建一个类似的散列(即文件名、行号、校验和的散列)。此代码有效。

我遇到的问题是从结果中重建一个类似的散列

这是我的代码:

def compare(dir_hash, database_hash)
  temp_hash     = database_hash.dup

  # retrieve the checksums from the dir_hash.
  dir_values    = dir_hash["HASHES"].sort_by(&:first).map { |x| x.last.values }

  # retrieve the checksums from database_hash
  db_values     = database_hash["HASHES"].sort_by(&:first).map { |x| x.last.values }

  # perform a set intersection to get the common values
  unique_values = dir_values.zip(db_values).map { |x| x.reduce(:&) }

  # code to reconstruct hash, based on new values
  new_hash      = temp_hash["HASHES"]

end

我似乎无法弄清楚如何使用修改后的值重建散列。

感谢帮助。

注意

sort_by(&:first) 的目的是确保当我们执行集合交集时,我们是在相同的值上执行它,换句话说,我取集合交集目录中的文件 x 和数据库中的相同文件 x(由于 Ruby 不保留键的顺序)

由于sort_by 将返回一个数组,第一个元素将是文件名,第二个元素将是行号、校验和的散列

最佳答案

另一种方法:

intersect_ary = database_hash["HASHES"].keys & dir_hash["HASHES"].keys
new_hash = dir_hash
intersect_ary.each do |file|
  new_hash["HASHES"][file].select! {|key| new_hash["HASHES"][file][key] == database_hash["HASHES"][file][key]}
end

(假设你必须创建一个新的散列而不是仅仅改变 dir_hash)

关于Ruby - 从修改后的值重构哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29595440/

相关文章:

ruby - 从/到 JSON API 对象化 Ruby 哈希

ruby - 如何向 RubyGem 中的 gem 添加更多 'owners'

ruby - 为什么我使用 Ruby 注入(inject)的斐波那契数列不起作用?

ruby-on-rails - Mongoid 和 ActiveRecord 关系 : undefined method `quoted_table_name'

ruby-on-rails - 访问 RABL 模板中的子实例

ruby - Nokogiri 在进行 XPath 搜索时不返回任何内容

ruby-on-rails - 使用 activerecord 连接两个以上的表

ruby - Ruby 基准测试如何计算线程内的总 CPU 时间

ruby - 在生成的 RSS 提要中将内容编码为 CDATA

ruby - Grit 是否适用于 Windows 7?