Rubyアレイにいくつかの値のいずれかが含まれているかどうかを確認するにはどうすればよいですか?
質問
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
所属していません StackOverflow