【问题标题】:Intersection of 2 array of strings with different upper and lower case2个大小写不同的字符串数组的交集
【发布时间】:2016-07-08 11:11:56
【问题描述】:

我想得到 2 个字符串数组的交集。第一个数组有不同的大小写。我想要的结果数组应该尊重第一个数组的大小写,但是 2 之间的比较应该忽略大写/小写。例如

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
}

但是有没有更短/更整洁的方法?

【问题讨论】:

    标签: ruby-on-rails arrays ruby


    【解决方案1】:

    你可以使用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

    【讨论】:

    • 那个“整洁”的版本简直是天方夜谭:)
    • @SergioTulentsev:正如我所说,仅代表我的意见。感觉就像一个原子表达式,不像第一个
    • @potashin 谢谢。不过我更喜欢你的第一个。我会接受塞尔吉奥的回答,虽然它是单行的,但这也很棒
    【解决方案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"]
    

    【讨论】:

    • 很好的答案谢谢,我会选择你的第一个,因为我个人倾向于避开正则表达式:)
    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多