Как я могу проверить, включает ли массив рубирования одним из нескольких значений?
Вопрос
У меня есть две рубиновые массивы, и мне нужно посмотреть, имеют ли у них какие-либо ценности общего. Я мог бы просто цикровать каждый из ценностей в одном массиве и включать? () С другой, но я уверен, что есть лучший способ. Что это такое? (Массивы оба удерживают строки.)
Спасибо.
Решение
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 ]
Однако, если вы ищете полный перекресток, однако (с дубликатами) проблема более сложной, здесь уже есть переполнение стека: Как вернуть пересечение массива Ruby с дублирующими элементами? (Проблема с Bigrams в коэффициенте кости)
Или быстрое фрагмент который определяет «Real_indersection» и подтверждает следующий тест
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
Использование пересечения выглядит приятно, но это неэффективно. Я бы использовал "нибудь?" на первом массиве (так, что итерация останавливается, когда один из элементов найден во втором массиве). Кроме того, использование набора на второй массив сделает членство проверять быстро. IE:
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