Rubyアレイにいくつかの値のいずれかが含まれているかどうかを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2603895

  •  25-09-2019
  •  | 
  •  

質問

2つのRubyアレイがあり、共通の値があるかどうかを確認する必要があります。 1つの配列の各値をループして、もう片方には?()を含めることができますが、より良い方法があると確信しています。それは何ですか? (配列は両方とも文字列を保持します。)

ありがとう。

役に立ちましたか?

解決

交差する設定 彼ら:

a1 & a2

これが例です:

> a1 = [ 'foo', 'bar' ]
> a2 = [ 'bar', 'baz' ]
> a1 & a2
=> ["bar"]
> !(a1 & a2).empty? # Returns true if there are any elements in common
=> true

他のヒント

共通点はありますか?交差点演算子を使用できます。 &

[ 1, 1, 3, 5 ] & [ 1, 2, 3 ]   #=> [ 1, 3 ]

ただし、完全な交差点を探している場合(重複する)問題はより複雑です。ここにはすでにスタックオーバーフローがあります。 複製要素とルビーアレイの交差点を返す方法は? (サイコロ係数のBigRamsの問題)

または簡単です スニペット 「real_intersection」を定義し、次のテストを検証します

class ArrayIntersectionTests < Test::Unit::TestCase    
  def test_real_array_intersection
    assert_equal [2], [2, 2, 2, 3, 7, 13, 49] & [2, 2, 2, 5, 11, 107]
    assert_equal [2, 2, 2], [2, 2, 2, 3, 7, 13, 49].real_intersection([2, 2, 2, 5, 11, 107])
    assert_equal ['a', 'c'], ['a', 'b', 'a', 'c'] & ['a', 'c', 'a', 'd']
    assert_equal ['a', 'a', 'c'], ['a', 'b', 'a', 'c'].real_intersection(['a', 'c', 'a', 'd'])
  end
end

交差点を使用することは見栄えが良いですが、それは非効率的です。 「any?」を使用します。最初の配列で(そのため、2番目の配列で要素の1つが見つかったときに反復が停止します)。また、2番目の配列にセットを使用すると、メンバーシップチェックが速くなります。つまり:

a = [:a, :b, :c, :d]
b = Set.new([:c, :d, :e, :f])
c = [:a, :b, :g, :h]

# Do a and b have at least a common value?
a.any? {|item| b.include? item}
# true

# Do c and b have at least a common value?
c.any? {|item| b.include? item}
#false

これを試して

a1 = [ 'foo', 'bar' ] 
a2 = [ 'bar', 'baz' ]
a1-a2 != a1
true
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top