索引和比较字符串索引或哈希

时间:2012-04-28 18:33:03

标签: ruby string comparison

我希望通过关注系统中双打最多的歌曲来清理我的音乐库。我可以将它们全部列出,然后手动排序,但这需要很长时间。我希望列表对最可能的重复项进行排序。因此,如果一首歌有10个重复,那就意味着有10个相似的歌曲,因此我会首先关注那首歌,以保持最佳版本。

我可以使用levenshtein字符串比较技术和gem

来比较两个歌名
require 'levenshtein'
Levenshtein.distance("string1", "string2") => 1

但是,假设我有x个歌曲,我必须将每首歌曲进行x次比较,因为我不能依赖正常的文件归档,我会错过一些重复的歌曲。例如

The Beatles - Hey Jude
Beatles, The - hey jude
Beatles_-_Hey_Judy_(remastered)

应该给披头士乐队 - 嘿judy(x3)

有没有办法根据文件名生成索引,然后可以对其进行排序,并按降序排列所有重复项?一种可以比较的哈希值?

我知道其他音乐比较方法,但它们有缺陷,这也可用于比较其他类型的文件。

1 个答案:

答案 0 :(得分:3)

尝试使用此代码

files是一个文件名数组,max_distance是考虑名称相似的最大距离。

hash = {}
files.each do |file|
  similar = hash.keys.select { |f| Levenshtein.distance(f, file) < max_distance }
  if similar.any?
    hash[similar.first] += 1
  else
    hash.merge!({file => 0})
  end
end

之后,您将获得hash,其中文件名为键,“重复”计为值,您可以根据需要对其进行排序。