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

これは、より一般的なケースで機能します。

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

これは、2 つのリストの連結で 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 に答える