在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"}>