2016-07-08 19 views
3

我想得到2個字符串的交集。第一個數組有不同的大小寫。我想要的結果數組應該尊重第一個數組的外殼,但2之間的比較應該忽略大寫/小寫。例如。不同大小寫的字符串交集2

letters = ['Aaa', 'BbB', 'CCC'] 

permitted = ['aaa', 'bbb'] 

結果應該是:

['Aaa', 'BbB'] 

Im做:

letters.map(&:downcase) & permitted.map(&:downcase) 

但這返回['aaa', 'bbb']

什麼是這樣做的簡潔的方式?這樣做的更長的方法是:

letters.each { |letter| 
    if permitted.include?(letter.downcase) 
     accepted.push(letter) 
    end 
} 

但有一個較短/更合適的方法?

回答

2

有在不區分大小寫的方式,String#casecmp比較字符串的方法:

letters = ['Aaa', 'BbB', 'CCC'] 
permitted = ['aaa', 'bbb'] 

letters.select{|l| permitted.detect{|p| p.casecmp(l) == 0 } } # => ["Aaa", "BbB"] 

您也可以use regular expressions。 :)

letters = ['Aaa', 'BbB', 'CCC'] 
permitted = ['aaa', 'bbb'] 

letters.grep(Regexp.new(permitted.join('|'), Regexp::IGNORECASE)) # => ["Aaa", "BbB"] 
+0

偉大的答案謝謝,我要去你的第一個,因爲我個人傾向於避開正則表達式:) – Mark

3

您可以使用select

search = permitted.map(&:downcase) 
letters.select{|letter| 
    search.include?(letter.downcase) 
} 

甚至更​​整潔(恕我直言):

-> search { 
    letters.select{|x| search.include?(x.downcase)} 
}.call(permitted.map(&:downcase)) 

Demonstration

+0

這「整潔」版本是神祕的地獄:) –

+0

@SergioTulentsev:正如我所說,我的意見只。它只是感覺作爲一個原子表達式,不像第一個 – potashin

+0

@potashin謝謝。我更喜歡你的第一個。我會接受塞爾吉奧的答案,雖然它是一個單一的行,但這也是偉大的 – Mark