Comment puis-je vérifier si un tableau Ruby comprend une de plusieurs valeurs?
Question
J'ai deux tableaux Ruby, et je dois voir s'ils ont des valeurs en commun. Je pourrais boucle à travers chacune des valeurs dans un tableau et ne comprennent? () Sur l'autre, mais je suis sûr qu'il ya une meilleure façon. Qu'Est-ce que c'est? (Les tableaux les deux chaînes détiennent.)
Merci.
La solution
Set intersecte les:
a1 & a2
Voici un exemple:
> a1 = [ 'foo', 'bar' ]
> a2 = [ 'bar', 'baz' ]
> a1 & a2
=> ["bar"]
> !(a1 & a2).empty? # Returns true if there are any elements in common
=> true
Autres conseils
? vous pouvez utiliser l'opérateur d'intersection: &
[ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ]
Si vous êtes à la recherche d'une intersection complète cependant (avec doublons) le problème est plus complexe il y a déjà un débordement de pile ici: Comment retourner une intersection de tableau Ruby avec des éléments en double? (Problème avec bigrams coefficient Dice)
Ou un rapide extrait qui définit "real_intersection" et valide le test suivant
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
En utilisant l'intersection est joli, mais il est inefficace. J'utiliser « tout? » sur le premier réseau (de sorte que l'itération arrête lorsque l'un des éléments se trouve dans le second réseau). De plus, en utilisant un ensemble sur le deuxième réseau fera des contrôles d'adhésion rapide. i.e.:.
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
Essayer cette
a1 = [ 'foo', 'bar' ]
a2 = [ 'bar', 'baz' ]
a1-a2 != a1
true