Поиск разницы между строками в Ruby

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

Итак, скажем, у меня есть:

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

$ teamOne.eql? teamTwo 
=> false

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

Похоже на дубликат stackoverflow.com/questions/80091/diff-a-ruby-string-or-arra‌ y

Samuel 09.01.2009 01:17

увидеть это stackoverflow.com/questions/13824444/…

tokhi 06.01.2016 17:52
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
13
2
19 159
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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.

Chuck 09.01.2009 03:18

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

 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.

Chuck 09.01.2009 03:17

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

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 = "Билли, Фрэнки, Стиви, Джон, Билли". Не в наборе один Билли будет удален .. потому что вы знаете, что это набор, теперь пересечение двух наборов не даст вам результата, как должно

Vamsi Pavan Mahesh 04.04.2017 15:14

Я понял вопрос двояко. Если вы хотите сделать разницу строк (слово в слово), которая охватывает этот случай:

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

Другие вопросы по теме