Мне нужно взять две строки, сравнить их и распечатать разницу между ними.
Итак, скажем, у меня есть:
teamOne = "Billy, Frankie, Stevie, John"
teamTwo = "Billy, Frankie, Stevie"
$ teamOne.eql? teamTwo
=> false
Я хочу сказать: «Если две строки не равны, напечатайте все, что между ними отличается. В этом случае я просто хочу напечатать« Джон ».
увидеть это stackoverflow.com/questions/13824444/…

Если реальная строка, которую вы сравниваете, похожа на предоставленную вами строку, то это должно сработать:
teamOneArr = teamOne.split(", ")
=> ["Billy", "Frankie", Stevie", "John"]
teamTwoArr = teamTwo.split(", ")
=> ["Billy", "Frankie", Stevie"]
teamOneArr - teamTwoArr
=> ["John"]
Это говорит о том, что teamOne и teamTwo одинаковы, если teamTwoArr является надмножеством teamOneArr. Он должен быть ((teamOneArr - teamTwoArr) + (teamTwoArr - teamOneArr)), чтобы найти уникальные элементы в teamOne или же teamTwo.
простое решение:
def compare(a, b)
diff = a.split(', ') - b.split(', ')
if diff === [] // a and b are the same
true
else
diff
end
end
конечно, это работает, только если ваши строки содержат значения, разделенные запятыми, но это можно изменить в зависимости от ситуации.
Это говорит о том, что a и b одинаковы, если b является надмножеством a. Он должен быть ((split_a - split_b) + (split_b - split_a)), чтобы найти элементы, уникальные в или же b.
Сначала вам нужно отсортировать, чтобы убедиться, что вы не вычитаете большую строку из меньшей:
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)
Все решения до сих пор игнорируют тот факт, что второй массив также может иметь элементы, которых нет в первом массиве. Чак указал на исправление (см. Комментарии к другим сообщениям), но есть более элегантное решение, если вы работаете с наборами:
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"}>
Затем этот набор можно при необходимости преобразовать обратно в массив.
Это решение не работает, если в одной строке есть повторяющийся элемент, например .. teamOne = "Билли, Фрэнки, Стиви, Джон, Билли". Не в наборе один Билли будет удален .. потому что вы знаете, что это набор, теперь пересечение двух наборов не даст вам результата, как должно
Я понял вопрос двояко. Если вы хотите сделать разницу строк (слово в слово), которая охватывает этот случай:
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"}>
Похоже на дубликат stackoverflow.com/questions/80091/diff-a-ruby-string-or-arra y