2009-01-08 125 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)