2013-03-30 123 views
2

說我有3個字符串數組:比較字符串並打印出匹配(紅寶石)

strings = ["/I/love/bananas", "/I/love/blueberries", "/I/love/oranges"] 

我想比較我的3串並打印出這個新的字符串:

new_string = "/I/love" 

我不想按字符匹配char,只能逐字逐句匹配。有沒有人有一個聰明的方式來做到這一點?

由於良好的令牌將我做這個醜陋的代碼顯示什麼功能,我在尋找:

strings = ["/I/love/bananas", "/I/love/blueberries", "/I/love/oranges"] 
benchmark = strings.first.split("/") 
new_string = [] 

strings.each_with_index do |string, i| 
    unless i == 0 
    split_string = string.split("/") 
    split_string.each_with_index do |elm, i| 
     final_string.push(elm) if elm == benchmark[i] && elm != final_string[i] 
    end 
    end 
end 

final_string = final_string.join("/") 

puts final_string # => "/I/love" 
+0

當你想輸出''/ I/love''?你想比較哪些東西?根據你想要產生最終產出的結果? –

+0

嗨。我想比較字符串匹配。如果例如基準[1]是「愛」,所有其他字符串在索引1處都有「愛」,我想將「愛」打印到我的new_string中。現在我想到了,但是我的實例代碼太糟糕了,因爲如果我添加一個字符串就會破壞我的邏輯。 「I/love/bananas/as/well」,或者多一個「我/愛/香蕉」。 – JohnSmith1976

+0

增加了一個答案。希望它能幫助你。 –

回答

3

這是相同的基本方法如@iAmRubuuu,但在輸入處理多於三個的字符串和更簡潔和功能性。

strings.map{ |s| s.split('/') }.reduce(:&).join('/') 
+1

不錯的一個! 'strings = [「/ I/love/bananas」,「/ I/love/blueberries」,「/ I/love/oranges」] a = strings.each_with_object([]){| i,a | a << i.split('/')} .reduce(:&)。join('/') p a' –

+0

忘記了'inject' /'reduce'的二元運算。 :D –

+0

是的,這也是一個很好的答案。謝謝。 – JohnSmith1976

1
str = ["/I/love/bananas", "/I/love/blueberries", "/I/love/oranges"] 

tempArr = [] 

str.each do |x| 
    tempArr << x.split("/") 
end 
(tempArr[0] & tempArr[1] & tempArr[2]).join('/') #=> "/I/love" 
3

你可以試試下面的:

p RUBY_VERSION 
strings = ["/I/love/bananas", "/I/love/blueberries", "/I/love/oranges"] 
a = strings.each_with_object([]) { |i,a| a << i.split('/') } 
p (a[0] & a[1] & a[2]).join('/') 

strings = ["/I/love/bananas", "/I/love/blueberries", "/I/love/oranges"] 
a = strings.each_with_object([]) { |i,a| a << i.split('/') }.reduce(:&).join('/') 
p a 

輸出:

"2.0.0" 
"/I/love" 
+0

當'map'完成時,不需要'each_with_object'和'<<'。原來只有三個元素的情況下,您的最終裁減纔有效。請參閱[我的答案](http://stackoverflow.com/a/15723691/1074296)以獲得更清晰的方法。 – dbenhur