我正在尝试构建一个简单的方法来查看数据库中的大约100个条目以获取姓氏,并提取所有匹配超过特定字母百分比的条目。我目前的做法是:
这样可行,但我觉得必须有一些很酷的ruby / regex / active记录方法来更有效地执行此操作。我用谷歌搜索了一下但找不到任何东西。
答案 0 :(得分:4)
评论你所建议的措施的优点需要推测,这在SO是超出界限的。因此,我将仅演示如何实施您提出的方法。
<强>代码强>
首先定义一个辅助方法:
class Array
def difference(other)
h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
reject { |e| h[e] > 0 && h[e] -= 1 }
end
end
简而言之,如果
a = [3,1,2,3,4,3,2,2,4]
b = [2,3,4,4,3,4]
然后
a - b #=> [1]
,而
a.difference(b) #=> [1, 3, 2, 2]
这个方法在我对this SO question的回答中详细阐述。我找到了很多用途,我proposed it be added to the Ruby Core。
以下方法生成一个哈希,其键是names
(字符串)的元素,其值是target
字符串中包含在{{1}中每个字符串中的字母的分数}}
names
示例强>
def target_fractions(names, target)
target_arr = target.downcase.scan(/[a-z]/)
target_size = target_arr.size
names.each_with_object({}) do |s,h|
s_arr = s.downcase.scan(/[a-z]/)
target_remaining = target_arr.difference(s_arr)
h[s] = (target_size-target_remaining.size)/target_size.to_f
end
end
,您要比较的名称由
提供target = "Jimmy S. Bond"
然后
names = ["Jill Dandy", "Boomer Asad", "Josefine Simbad"]
解释
对于target_fractions(names, target)
#=> {"Jill Dandy"=>0.5, "Boomer Asad"=>0.5, "Josefine Simbad"=>0.8}
和names
的上述值,
target
现在考虑
target_arr = target.downcase.scan(/[a-z]/)
#=> ["j", "i", "m", "m", "y", "s", "b", "o", "n", "d"]
target_size = target_arr.size
#=> 10
然后
s = "Jill Dandy"
h = {}
Boomer和Josefine的计算方法类似。