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

15

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

假设我有:

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

$ teamOne.eql? teamTwo 
=> false

我想说:“如果这两个字符串不相等,那么打印出它们之间不同的部分。在这个例子中,我只想打印出“John”。”


1
似乎是一个 https://dev59.com/a3VD5IYBdhLWcg3wHn2d 的重复问题。 - Samuel
请查看此链接:https://dev59.com/IGYr5IYBdhLWcg3wQYFa#13824648 - tokhi
5个回答

20
到目前为止,所有的解决方案都忽略了第二个数组可能拥有但第一个数组不具备的元素。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"}>

如果需要的话,这个集合可以转换回数组。


2
当一个字符串中有重复项时,例如.. teamOne = "Billy, Frankie, Stevie, John, Billy",此解决方案将失败。在集合中,一个Billy将被移除,因为你知道它是一个集合,现在两个集合的交集将不能给出正确的结果。 - Vamsi Pavan Mahesh

5
如果您要比较的实际字符串与提供的字符串相似,则可以使用以下代码:
teamOneArr = teamOne.split(", ")
=> ["Billy", "Frankie", Stevie", "John"]
teamTwoArr = teamTwo.split(", ")
=> ["Billy", "Frankie", Stevie"]
teamOneArr - teamTwoArr
=> ["John"]
其中,teamOne和teamTwo是需要进行比较的字符串。将它们分别通过split方法转换为数组,并使用减号运算符得到不同之处。

1
如果teamTwoArr是teamOneArr的超集,那么这意味着teamOne和teamTwo是相同的。为了找到在teamOne或teamTwo中唯一的元素,需要使用((teamOneArr - teamTwoArr) + (teamTwoArr - teamOneArr))。 - Chuck

5
简单解决方案:
 def compare(a, b)
   diff = a.split(', ') - b.split(', ')
   if diff === [] // a and b are the same
     true
   else
     diff
   end
 end

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


2
如果b是a的超集,则表示a和b相同。需要使用((split_a - split_b) + (split_b - split_a))来查找在a b中唯一的元素。 - Chuck

3

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

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)

0
我两种理解了这个问题。如果你想做一个字符串差异(逐字逐句),以涵盖此案例:
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(' ')

结果是:

Tom, Stevie, John

被接受的答案给出:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接