2009-01-08 36 views
10

Tôi cần phải lấy hai chuỗi, so sánh chúng và in sự khác biệt giữa các chuỗi.Tìm sự khác biệt giữa các chuỗi trong Ruby

Vì vậy, nói tôi có:

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

$ teamOne.eql? teamTwo 
=> false 

tôi muốn nói "Nếu hai dây không bằng nhau, in bất cứ điều gì đó là khác nhau giữa chúng Trong trường hợp này, Tôi chỉ tìm kiếm để in. "John"

+1

Dường như bản sao của http://stackoverflow.com/questions/80091/diff-a-ruby-string-or-array – Samuel

+0

xem http://stackoverflow.com/questions/13824444/comparing-two- này string-in-ruby/13824648 # 13824648 – tokhi

Trả lời

13

Tất cả các giải pháp cho đến nay bỏ qua thực tế là mảng thứ hai cũng có thể có những yếu tố mà người đầu tiên mảng không có. Chuck đã chỉ ra cách khắc phục (xem ý kiến ​​về bài viết khác), nhưng có một giải pháp thanh lịch hơn nếu bạn làm việc với 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"}> 

bộ này sau đó có thể được chuyển đổi trở lại một mảng nếu cần thiết.

+0

Giải pháp này không thành công khi có một mục lặp đi lặp lại trong một chuỗi, ví dụ .. teamOne = "Billy, Frankie, Stevie, John, Billy". Không phải trong một thiết lập Billy sẽ được gỡ bỏ ..cuz bạn biết đó là một bộ, bây giờ giao nhau của hai bộ sẽ không cung cấp cho bạn kết quả như nó nên –

4

Nếu chuỗi thực bạn đang so sánh tương tự như các chuỗi mà bạn cung cấp, thì đây sẽ làm việc:

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

Điều này cho biết teamOne và teamTwo là như nhau nếu teamTwoArr là một superset của teamOneArr. Nó cần phải ((teamOneArr - teamTwoArr) + (teamTwoArr - teamOneArr)) để tìm các phần tử duy nhất trong teamOne * hoặc * teamTwo. – Chuck

4

giải pháp dễ dàng:

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

tất nhiên điều này chỉ hoạt động nếu chuỗi của bạn chứa giá trị được phân tách bằng dấu phẩy, nhưng điều này có thể được điều chỉnh theo tình huống của bạn.

+1

Điều này nói a và b là như nhau nếu b là một siêu của a. Nó cần phải là ((split_a - split_b) + (split_b - split_a)) để tìm các phần tử duy nhất trong dấu * hoặc * b. – Chuck

3

Bạn cần phải sắp xếp đầu tiên để đảm bảo bạn không trừ một chuỗi lớn hơn từ một nhỏ một:

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) 
Các vấn đề liên quan