两个大小写不同的字符串数组的交集

3

我希望获得两个字符串数组的交集。第一个数组中包含大小写不同的字符串。我希望得到的结果数组应该保留第一个数组中的大小写,但是比较两个数组时应该忽略大小写。例如:

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

permitted = ['aaa', 'bbb']

应该得到的结果是:
['Aaa', 'BbB']

我正在进行:

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

但是这会返回['aaa', 'bbb']

有没有更简便的方法呢?更长的方法是:

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

但是,有没有更简短/更整洁的方法呢?
2个回答

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))

演示

(该链接为演示)

1
那个“整洁”的版本简直晦涩难懂 :) - Sergio Tulentsev
@SergioTulentsev:正如我所说,这只是我的观点。它感觉像一个原子表达式,不像第一个。 - potashin
@potashin 谢谢。虽然我更喜欢你的第一个回答,但我会接受Sergio的答案,因为它只有一行,但这个也很好。 - Mark

2
有一种方法可以以不区分大小写的方式比较字符串,即 String#casecmp
letters = ['Aaa', 'BbB', 'CCC']
permitted = ['aaa', 'bbb']

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

你也可以使用正则表达式。 :)
letters = ['Aaa', 'BbB', 'CCC']
permitted = ['aaa', 'bbb']

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

非常感谢您的出色回答,我会选择您的第一个答案,因为我个人倾向于避免使用正则表达式 :) - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接