0

这是测试用例

a = ["Barack", "Obama"]
b = ["John", "Obama"]

现在如果我这样做a & b。它给了我["Obama"]。常见的被渲染。

虽然如果这是场景

a = ["Barack", "Obama"]
b = ["John", "obama"] # See O is not capitalized here

我愿意a & b。我将得到一个空数组[]作为输出。我明白为什么。虽然,如何解决这个问题并使其区分大小写不区分大小写?

谢谢

更新:没必要总是小写。a可以有小写字符串和b所有大写字符串,反之亦然。

4

3 回答 3

2

这不是防弹的,它不会产生原始数组值,但它可能是 Good Enough™:

common = a.map(&:downcase) & b.map(&:downcase)

要检索满足测试的原始值,您可以尝试以下操作:

require 'set'

xs = ["Barack", "Obama"]
ys = ["John", "Obama"]

univ = ys.map(&:downcase).to_set
hits = xs.select { |x| univ.include?(x.downcase) }
于 2013-05-16T15:26:49.240 回答
2

这适用于更一般的情况:

class Array
  def intersection other, &block
    block ||= proc{|x| x }
    res = []
    transformed_other = other.map(&block)
    self.each do |x|
      res << x if transformed_other.include?(block.call(x))
    end
    res
  end
end

现在使用您的测试数据:

a = ["Barack", "Obama"]
b = ["John", "obama"]

您可以正常地与数组相交(相当于a & b):

a.intersection(b)
#=> []

或者您可以提供一个块:

a.intersection(b, &:downcase)
#=> ["Obama"]

a在这种情况下,此方法将保留第一个数组中的原始值。

于 2013-05-16T15:47:15.280 回答
0

这是在两个列表的连接上使用 group_by 的一般方法的另一个削减。结果包含接收器中元素的原始表示。

class Array
  def intersect_by other, &block
    (self + other).
    group_by(&block).
    values.
    select{ |v| v.size == 2 }.
    map(&:first)
  end
end

a.intersect_by(b, &:downcase)
=> ["Obama"]
于 2013-05-16T18:08:38.173 回答