2013-11-25 44 views
1

我有兩個字符串:Ruby快速串子集分析

"0123" 
"023" 

我希望能夠以顯示「0」,「2」和「3」在「0123」的存在,我已經試過陣列,設置和字符串上的子字符串方法,無濟於事。

有沒有辦法有效地做到這一點?

回答

3

您可以使用陣列路口(Array#&):

a = '0123'.chars 
b = '023'.chars 

intersections = a & b 
+0

我選擇了這個答案,因爲它看起來更有效率。 – user1658296

+2

我建議使用'chars'而不是'split('')',因爲它更清晰和更快。 – toro2k

+0

@ toro2k謝謝,更新 –

1

我在想兩個字符串作爲數組,然後作爲集合,然後試圖獲得他們之間的差異。 但是你不想要你想要的相似之處的差異,所以這就是爲什麼!include之前。

a.split("").reject{|x| !"023".split("").include?(x)} 

這可能再往細化到多一點可讀

first_string = "0123".split("") 
second_string = "023".split("") 

first_string.reject{ |x| !second_string.include?(x) } 

;最後,如果你想要更多的東西紅寶石去年秋季,你可以使用intersections

result = first_string & second_string 
+0

謝謝我設法做到了這一點:if a.split(「」)。reject {| x | !「#{b}」。split(「」)。include?(x)}。join == b ... end – user1658296

-1

這完美的作品。

matches = [] 
"023".each_char { |c| matches << c if "0123".index(c) } 

p matches # Output ["0", "2", "3"] 
0

這將返回一個字符串的所有字符是否存在於所述第二,通過循環所需的串的每一字節值和檢查如果字符值是存在於串中來檢查,在加入結果將其與需要的字符串進行比較以返回true或false。

to_check = '0123' 
to_check2 = '9123' 
needed = '023' 

p needed.each_byte.map{|c|to_check[c.chr]}.join == needed #true 
p needed.each_byte.map{|c|to_check2[c.chr]}.join == needed #false