Ruby 函数,该函数返回rails中的公共字符数

Ruby 函数,该函数返回rails中的公共字符数,ruby,string,Ruby,String,ruby中是否有函数比较两个字符串并返回它们的共同字符数?没有一个,但编写一个就很简单了: def matching_chars(str1, str2) chars, index = str2.chars, -1 str1.chars.count {|c| chars[index += 1] == c } end 只需迭代一个字符串的字符,并计算它与另一个字符串位置的字符匹配的次数。没有一个字符,但编写一个字符很简单: def matching_chars(str1, str2)

ruby中是否有函数比较两个字符串并返回它们的共同字符数?

没有一个,但编写一个就很简单了:

def matching_chars(str1, str2)
  chars, index = str2.chars, -1
  str1.chars.count {|c| chars[index += 1] == c }
end

只需迭代一个字符串的字符,并计算它与另一个字符串位置的字符匹配的次数。

没有一个字符,但编写一个字符很简单:

def matching_chars(str1, str2)
  chars, index = str2.chars, -1
  str1.chars.count {|c| chars[index += 1] == c }
end
只需迭代一个字符串的字符,并计算它与另一个字符串位置的字符匹配的次数。

s1 = "abacad"
s2 = "bagfa"
你可以写:

(s1.chars & s2.chars).size
  #=> 2
如果要计数重复项,请执行以下操作:

s1.chars.uniq.reduce(0) { |cnt,c| cnt + [s1.count(c), s2.count(c)].min }
  #=> 3
Edit1:在阅读@ChrisHeald的评论后,我看到OP在评论中添加了一个额外的要求:匹配的字符占据相同的位置。在这种情况下,更容易:

s1.chars.zip(s2[0,[s1.size, s2.size].min].chars).count { |c1,c2| c1==c2 }
  #=> 1
正如@ChrisHeald指出的一个问题,我不得不修改我最初拥有的东西。不幸的是,修正带来了丑陋(以及一个临时字符串和另一个临时数组)

我们有

a = s1.chars.zip(s2.chars)
  #=> [["a", "b"], ["b", "a"], ["a", "g"], ["c", "f"], ["a", "a"], ["d", nil]]
a.count { |c1,c2| c1==c2 } 
  #=> 1
Edit2:

要避免创建中间数组,请执行以下操作:

[s1.size, s2.size].min.times.count { |i| s1[i] == s2[i] }
  #=> 1
出租:

s1 = "abacad"
s2 = "bagfa"
你可以写:

(s1.chars & s2.chars).size
  #=> 2
如果要计数重复项,请执行以下操作:

s1.chars.uniq.reduce(0) { |cnt,c| cnt + [s1.count(c), s2.count(c)].min }
  #=> 3
Edit1:在阅读@ChrisHeald的评论后,我看到OP在评论中添加了一个额外的要求:匹配的字符占据相同的位置。在这种情况下,更容易:

s1.chars.zip(s2[0,[s1.size, s2.size].min].chars).count { |c1,c2| c1==c2 }
  #=> 1
正如@ChrisHeald指出的一个问题,我不得不修改我最初拥有的东西。不幸的是,修正带来了丑陋(以及一个临时字符串和另一个临时数组)

我们有

a = s1.chars.zip(s2.chars)
  #=> [["a", "b"], ["b", "a"], ["a", "g"], ["c", "f"], ["a", "a"], ["d", nil]]
a.count { |c1,c2| c1==c2 } 
  #=> 1
Edit2:

要避免创建中间数组,请执行以下操作:

[s1.size, s2.size].min.times.count { |i| s1[i] == s2[i] }
  #=> 1

我知道没有这样的内置方法,但是如果你能更好地定义你的问题空间,你可以写一个。你能举几个例子吗?我想这不是家庭作业吗?:)这不是家庭作业:)我想实现jaro-winkler算法,第一步是计算m,其中m是相同位置的匹配字符数(我忘了在我的问题中提到这一点)。例如,对于“板条箱”,一个“轨迹”m是3(它们在公共位置有R、A、E:1、2和3)。但是我想我必须自己做如果是这样的话,那么这是一个XY问题。我知道没有这样的内置方法,但是如果你能更好地定义你的问题空间,你可以写一个。你能举几个例子吗?我想这不是家庭作业吗?:)这不是家庭作业:)我想实现jaro-winkler算法,第一步是计算m,其中m是相同位置的匹配字符数(我忘了在我的问题中提到这一点)。例如,对于“板条箱”,一个“轨迹”m是3(它们在公共位置有R、A、E:1、2和3)。但是我想我必须自己做如果是这样的话,那么这是一个XY问题。这将返回所有公共字符,而不是所有公共字符在同一位置<代码>s1=“ab”;s2=“ba”给出了m/2,当它应该是0时。@Chris,我是按问题来的,没有注意到OP评论中的附加信息。(人们没有注意到“编辑”按钮吗?);对于字符串处理,这些可能不是理想的特性。@ChrisHeald,与我编辑的上一条评论一致,以使用
count
。不同长度的字符串(如我的示例中所示)不是问题,但是是的,
zip
创建临时数组。不仅仅是一个临时数组,每个字符对一个临时数组,然后是一个包含数组。:)如果s2比s1长,Zip将失败,但-
[1]。Zip([1,2])=>[1,1]]
这将返回所有公共字符,而不是相同位置的所有公共字符<代码>s1=“ab”;s2=“ba”给出了m/2,当它应该是0时。@Chris,我是按问题来的,没有注意到OP评论中的附加信息。(人们没有注意到“编辑”按钮吗?);对于字符串处理,这些可能不是理想的特性。@ChrisHeald,与我编辑的上一条评论一致,以使用
count
。不同长度的字符串(如我的示例中所示)不是问题,但是是的,
zip
创建临时数组。不仅仅是一个临时数组,每个字符对一个临时数组,然后是一个包含数组。:)如果s2比s1长,Zip将失败,尽管-
[1]。Zip([1,2])=>[1,1]]