views:

1423

answers:

4

I need to take two strings, compare them, and print the difference between them.

So say I have:

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

$ teamOne.eql? teamTwo 
=> false

I want to say "If the two strings are not equal, print whatever it is that is different between them. In this case, I'm just looking to print "John."

+3  A: 

If the real string you are comparing are similar to the strings you provided, then this should work:

teamOneArr = teamOne.split(", ")
=> ["Billy", "Frankie", Stevie", "John"]
teamTwoArr = teamTwo.split(", ")
=> ["Billy", "Frankie", Stevie"]
teamOneArr - teamTwoArr
=> ["John"]
erik
This says teamOne and teamTwo are the same if teamTwoArr is a superset of teamOneArr. It needs to be ((teamOneArr - teamTwoArr) + (teamTwoArr - teamOneArr)) to find elements that are unique in teamOne *or* teamTwo.
Chuck
+3  A: 

easy solution:

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

of course this only works if your strings contain comma-separated values, but this can be adjusted to your situation.

gabriel
This says a and b are the same if b is a superset of a. It needs to be ((split_a - split_b) + (split_b - split_a)) to find elements that are unique in a *or* b.
Chuck
+2  A: 

You need to sort first to ensure you are not subtracting a bigger string from a smaller one:

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)
BigCanOfTuna
+8  A: 

All of the solutions so far ignore the fact that the second array can also have elements that the first array doesn't have. Chuck has pointed out a fix (see comments on other posts), but there is a more elegant solution if you work with sets:

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

This set can then be converted back to an array if need be.

Zach Langley