Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中查找字符串之间的差异_Ruby_String - Fatal编程技术网

在Ruby中查找字符串之间的差异

在Ruby中查找字符串之间的差异,ruby,string,Ruby,String,我需要取两个字符串,比较它们,然后打印它们之间的差异 所以说我有: teamOne = "Billy, Frankie, Stevie, John" teamTwo = "Billy, Frankie, Stevie" $ teamOne.eql? teamTwo => false 我想说“如果两个字符串不相等,请打印它们之间的任何不同之处。在这种情况下,我只是想打印“John”。如果您要比较的实际字符串与您提供的字符串相似,那么这应该可以: teamOneArr = teamOne

我需要取两个字符串,比较它们,然后打印它们之间的差异

所以说我有:

teamOne = "Billy, Frankie, Stevie, John"
teamTwo = "Billy, Frankie, Stevie"

$ teamOne.eql? teamTwo 
=> false

我想说“如果两个字符串不相等,请打印它们之间的任何不同之处。在这种情况下,我只是想打印“John”。

如果您要比较的实际字符串与您提供的字符串相似,那么这应该可以:

teamOneArr = teamOne.split(", ") => ["Billy", "Frankie", Stevie", "John"] teamTwoArr = teamTwo.split(", ") => ["Billy", "Frankie", Stevie"] teamOneArr - teamTwoArr => ["John"] teamOneArr=teamOne.split(“,”) =>[“比利”、“弗兰基”、“史蒂维”、“约翰”] teamTwoArr=teamTwo.split(“,”) =>[“比利”、“弗兰基”、“史蒂维”] teamOneArr-teamTwoArr =>[“约翰”] 简易解决方案:

 def compare(a, b)
   diff = a.split(', ') - b.split(', ')
   if diff === [] // a and b are the same
     true
   else
     diff
   end
 end

当然,这只适用于字符串包含逗号分隔值的情况,但这可以根据您的情况进行调整。

您需要首先进行排序,以确保不会从较小的字符串中减去较大的字符串:

def compare(*params)
   params.sort! {|x,y| y <=> x}
   diff = params[0].split(', ') - params[1].split(', ')
   if diff === []
      true
   else
      diff
   end 
end

puts compare(a, b)
def比较(*params)
params.sort!{| x,y | y x}
diff=params[0]。拆分(“,”)-params[1]。拆分(“,”)
如果差异==[]
真的
其他的
差异
结束
结束
比较(a,b)

到目前为止,所有的解决方案都忽略了一个事实,即第二个数组也可以包含第一个数组没有的元素。Chuck指出了一个解决方案(请参阅其他帖子上的评论),但如果您使用集合,则有一个更优雅的解决方案:

require 'set'

teamOne = "Billy, Frankie, Stevie, John"
teamTwo = "Billy, Frankie, Stevie, Zach"

teamOneSet = teamOne.split(', ').to_set
teamTwoSet = teamTwo.split(', ').to_set

teamOneSet ^ teamTwoSet # => #<Set: {"John", "Zach"}>
require'set'
teamOne=“比利、弗兰基、史蒂维、约翰”
第二组=“比利、弗兰基、史蒂维、扎克”
teamOneSet=teamOne.split(',')。到_集
teamTwoSet=teamTwo.split(',')。到_集
teamOneSet^teamTwoSet#=>#

然后,如果需要,可以将此集合转换回数组。

我从两个方面理解了这个问题。如果您想进行字符串差异(逐字)处理,其中包括此情况:

teamOne = "Billy, Frankie, Tom, Stevie, John"
teamTwo = "Billy, Frankie, Stevie, Tom, Zach"

s1 = teamOne.split(' ')
s2 = teamTwo.split(' ')

diff = []
s1.zip(s2).each do |s1, s2|
  if s1 != s2
    diff << s1
  end
end

puts diff.join(' ')
公认的答案是:

#<Set: {"Zach", "John"}>
#

看起来像是a的复制品。这说明如果b是a的超集,a和b是相同的。它需要是((拆分a-拆分b)+(拆分b-拆分a))才能找到a或b中唯一的元素。这表示如果TeamToArr是teamOneArr的超集,teamOne和teamTwo是相同的。它需要是((teamOneArr-teamTwoArr)+(teamTwoArr-teamOneArr))查找在teamOne或teamTwo中唯一的元素。当一个字符串中存在重复项时,此解决方案将失败,例如..teamOne=“Billy,Frankie,Stevie,John,Billy”。不在集合中,将删除一个Billy..因为您知道它是一个集合,现在两个集合的交集不会给出应有的结果
#<Set: {"Zach", "John"}>