Найти разницу между строками в Ruby - PullRequest
10 голосов
/ 09 января 2009

Мне нужно взять две строки, сравнить их и вывести разницу между ними.

Так скажи, что у меня есть:

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

$ teamOne.eql? teamTwo 
=> false

Я хочу сказать: «Если две строки не равны, выведите все, что отличается между ними. В этом случае я просто хочу напечатать« Джон ».

Ответы [ 4 ]

16 голосов
/ 09 января 2009

Все решения до сих пор игнорируют тот факт, что второй массив также может иметь элементы, которых нет в первом массиве. Чак указал на исправление (см. Комментарии к другим записям), но есть более элегантное решение, если вы работаете с наборами:

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

Этот набор может быть преобразован обратно в массив, если это необходимо.

4 голосов
/ 09 января 2009

простое решение:

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

Конечно, это работает, только если ваши строки содержат значения, разделенные запятыми, но это можно отрегулировать в соответствии с вашей ситуацией.

4 голосов
/ 09 января 2009

Если реальная строка, которую вы сравниваете, похожа на предоставленную вами строку, то это должно работать:

teamOneArr = teamOne.split(", ")
=> ["Billy", "Frankie", Stevie", "John"]
teamTwoArr = teamTwo.split(", ")
=> ["Billy", "Frankie", Stevie"]
teamOneArr - teamTwoArr
=> ["John"]
3 голосов
/ 09 января 2009

Сначала вам нужно отсортировать, чтобы убедиться, что вы не вычитаете большую строку из меньшей:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...