2009-01-08 75 views
10

我需要兩個字符串,比較它們,並打印它們之間的差異。查找Ruby中字符串的區別

所以說我有:

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

$ teamOne.eql? teamTwo 
=> false 

我想說「如果兩個字符串不相等,打印什麼,那就是它們之間的不同。在這種情況下,我只是希望打印。 「約翰」

+1

似乎是一個重複的http://stackoverflow.com/questions/80091/diff-a-ruby-string-or-array – Samuel 2009-01-08 22:17:14

+0

看到這個http://stackoverflow.com/questions/13824444/comparing-two-字符串在紅寶石/ 13824648#13824648 – tokhi 2016-01-06 14:52:30

回答

13

所有的解決方案迄今忽視的事實是第二陣列也可以有元素第一數組沒有。查克指出修復(見其他帖子評論),但如果你帶套的工作更優雅的解決方案:

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

如果你是比較真實的字符串是類似於您所提供的字符串,那麼這應該工作:

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

這說teamOne和teamTwo是相同的,如果teamTwoArr是teamOneArr的超集。它需要((teamOneArr - teamTwoArr)+(teamTwoArr - teamOneArr))查找在teamOne *或* teamTwo中唯一的元素。 – Chuck 2009-01-09 00:18:31

4

簡單的解決方案:

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

當然這隻適用於如果你的字符串包含逗號分隔值,但這可以根據你的情況進行調整。

+1

這說a和b是一樣的,如果b是a的超集。它需要是((split_a - split_b)+(split_b - split_a))來查找在*或* b中唯一的元素。 – Chuck 2009-01-09 00:17:18

3

你需要排序首先要保證你是不是減去一個較小的一個更大的字符串:

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)