2009-01-08 13 views
10

Ich muss zwei Zeichenfolgen nehmen, sie vergleichen und den Unterschied zwischen ihnen drucken.Den Unterschied zwischen Zeichenfolgen in Ruby finden

Also sage ich:

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

$ teamOne.eql? teamTwo 
=> false 

ich will „sagen, wenn die beiden Strings nicht gleich sind, Druck, was auch immer es ist, dass anders ist sie zwischen In diesem Fall, ich suche nur zu drucken. „John“

+1

Scheint wie ein Duplikat von http://stackoverflow.com/questions/80091/diff-a-ruby-string-or-array – Samuel

+0

siehe http://stackoverflow.com/questions/13824444/comparting-two- strings-in-ruby/13824648 # 13824648 – tokhi

Antwort

13

Alle Lösungen bisher ignorieren die Tatsache, dass die zweite Anordnung auch Elemente, die die erste haben Array hat nicht. Chuck hat einen Fix darauf hingewiesen (siehe Kommentare zu anderen Beiträgen), aber es gibt eine elegantere Lösung, wenn Sie mit Sets arbeiten:

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

Dieser Satz kann dann wieder in ein Array umgewandelt werden, wenn es sein muss.

+0

Diese Lösung schlägt fehl, wenn sich in einer Zeichenfolge ein sich wiederholendes Element befindet. Beispiel: teamOne = "Billy, Frankie, Stevie, John, Billy". Nicht im Set wird Billy entfernt ... da Sie wissen, dass es ein Set ist, wird Ihnen die Schnittmenge zweier Sets nicht das Ergebnis geben, wie es sollte –

4

Wenn die reale Zeichenfolge Sie vergleichen zu den Saiten ähnlich sind Sie zur Verfügung gestellt, dann sollte diese Arbeit:

 
teamOneArr = teamOne.split(", ") 
=> ["Billy", "Frankie", Stevie", "John"] 
teamTwoArr = teamTwo.split(", ") 
=> ["Billy", "Frankie", Stevie"] 
teamOneArr - teamTwoArr 
=> ["John"] 
+1

Das sagt teamOne und teamTwo sind gleich wenn teamTwoArr eine Obermenge von teamOneArr ist. Es muss ((teamOneArr - teamTwoArr) + (teamTwoArr - teamOneArr)) sein, um Elemente zu finden, die in teamOne * oder * teamTwo eindeutig sind. – Chuck

4

einfache Lösung:

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

Dies funktioniert natürlich nur, wenn Ihre Strings durch Komma getrennte Werte enthalten, aber dies kann an Ihre Situation angepasst werden.

+1

Das sagt a und b sind gleich, wenn b eine Obermenge von a ist. Es muss ((split_a - split_b) + (split_b - split_a)) sein, um Elemente zu finden, die in a * oder * b eindeutig sind. – Chuck

3

Sie müssen zuerst sortieren Sie um sicherzustellen, dass nicht eine größere Zeichenfolge von einem kleineren Subtrahieren eines:

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) 
Verwandte Themen