如何在哈希中列出重复的条目?

时间:2014-06-05 18:13:53

标签: ruby

我试图从文件系统中删除重复文件,其中有大约12,000个体面大小(150+ MB)的文件。我希望套装中有20-50个重复。

我的想法是建立一个列出每个文件及其文件大小的散列,而不是对每个文件及其文件大小进行校验,而不是对每个文件进行校验和,消除文件大小唯一的条目,并且只对余数进行校验和,节省很多时候。

但是我在将哈希传递到唯一条目时遇到了一些麻烦。我试过,其中files是类似super_cool_map.png => 1073741824,的哈希:

uniques = files.values.uniq
dupes = files.delete_if do |k,v|
  uniques.include?(v)
end
puts dupes

但是只输出一个空白哈希。我该怎么办?

2 个答案:

答案 0 :(得分:2)

这是怎么回事?

# this will give the grouped same size files as an array.
files.group_by(&:last).map { |_, v| v.map(&:first) if v.size > 1 }.compact

答案 1 :(得分:2)

为什么不反转映射?使密钥为文件大小,值为list文件名。这样你就可以免费获得“按大小分组”。

然后您可以使用

过滤哈希值
my_hash = {30323 => ["file1", "file2"], 233 => ["file3"]}

filtered = my_hash.select{ |k, v|
  v.size > 1
}

p filtered # prints {30323 => ["file1", "file2"]}

现在你有一个散列,其中每个键对应一个你需要散列并相互比较的文件列表。