如何在Ruby中生成正则表达式字符串匹配的百分比?
我正在尝试构建一个简单的方法来查看数据库中的大约100个条目以获取姓氏,并拉出所有匹配超过特定字母百分比的条目。 我目前的做法是:
- 将数据库中的所有100个条目拉入数组
- 在执行以下操作时迭代它们
- 将姓氏拆分为一个字母数组
- 从另一个数组中减去该数组,该数组包含我要匹配的名称的字母,只留下不匹配的字母。
- 取结果的大小,除以步骤3中数组的原始大小,得到一个百分比。
- 如果百分比高于预定义阈值,请将该数据库对象推送到结果数组中。
这有效,但我觉得必须有一些很酷的ruby / regex / active记录方法来更有效地做到这一点。 我google了很多但找不到任何东西。
评论你所建议的措施的优点需要推测,这是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]
在我对这个问题的回答中详细阐述了这种方法。 我发现它有很多用途,我建议将它添加到Ruby Core中 。
以下方法生成一个哈希,其键是names
(字符串)的元素,其值是target
字符串中包含在names
中每个字符串中的字母的分数。
def target_fractions(names, target) target_arr = target.downcase.scan(/[az]/) target_size = target_arr.size names.each_with_object({}) do |s,h| s_arr = s.downcase.scan(/[az]/) 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(/[az]/) #=> ["j", "i", "m", "m", "y", "s", "b", "o", "n", "d"] target_size = target_arr.size #=> 10
现在考虑
s = "Jill Dandy" h = {}
然后
s_arr = s.downcase.scan(/[az]/) #=> ["j", "i", "l", "l", "d", "a", "n", "d", "y"] target_remaining = target_arr.difference(s_arr) #=> ["m", "m", "s", "b", "o"] h[s] = (target_size-target_remaining.size)/target_size.to_f #=> (10-5)/10.0 => 0.5 h #=> {"Jill Dandy"=>0.5}
Boomer和Josefine的计算结果相似。
- 如何根据Rails中的值更改HTML输出
- 需要帮助来理解`has_and_belongs_to_many`
- 在Rails ActiveRecord中,连接在命名空间模型中不能与has_and_belongs_to_many一起使用
- Rails 4嵌套属性和has_many:通过表单中的associaton
- ActiveModel方法属性“_was”用于什么?
- Rails让ActiveRecord一次性获取多个关联?
- 查找与Rails中的范围重叠的记录
- 可以在Rails / ActiveRecord中指定允许带NULL的唯一索引吗?
- Ruby on Rails ActiveRecord“has_many:through”唯一性validation