2011-07-02 3 views
1

J'utilise Ruby on Rails 3.0.7 et je voudrais vérifier si chaque élément d'un tableau est inclus dans un ensemble de valeurs présentes dans un autre tableau.Vérifiez si chaque élément d'un tableau est inclus dans un ensemble de valeurs d'un autre tableau

C'est, j'ai ces tableaux:

array1 = [1,3] 
array2 = [1,2,3,4,5] 

et je vérifie si les valeurs dans array1 sont tous présents dans le array2. Je reviens true si au moins l'un des array1 est différent de valeurs dans array2

Comment puis-je coder que d'une manière « bonne » Ruby?

P.S .: J'ai lu cette solution, mais il est pour les tableaux de Java.

+3

duplication possible de [Ruby: tableau contenu dans Array, n'importe quel ordre] (http://stackoverflow.com/questions/3897525/ruby-array-contained-in-array-any-order) –

Répondre

10

La meilleure chose serait de faire un set intersection et de voir ce que vous obtenez de cette:

intersection = array1 & array2 
if intersection.length == array1.length 
    # Everything in array1 is in array2 
end 

qui, de Bien sûr, échouer si array1 avait des doublons comme l'intersection compresse automatiquement les. Mais nous avons uniq de prendre soin de cette:

intersection = array1 & array2 
if intersection.length == array1.uniq.length 
    # Everything in array1 is in array2 
end 

Si vous vous attendez à des doublons dans vos tableaux, alors vous feriez mieux de travailler avec les instances de Set plutôt que des tableaux:

require 'set' 
s1 = Set.new(array1) 
s2 = Set.new(array2) 

if((s1 & s2) == s1) 
    # Everything in array1 is in array2 
end 

Ou utiliser subset? pour mieux répondre à vos intentions:

if(s1.subset?(s2)) 
    # Everything in array1 is in array2 
end 

L'utilisation des ensembles prendra soin de vos problèmes en double avec moins de bruit que d'avoir à utiliser uniq tout le temps. Il y aurait, bien sûr, un peu de surcharge supplémentaire, mais vous devriez optimiser la clarté avant les performances (faites-le fonctionner, puis faites-le rapidement seulement s'il est trop lent).

0
includes = true 

array1.each do |elem| 
    if !array2.include?(elem) 
    includes = false 
    end 
end 

Et vous aurez à includes variables ce que vous avez besoin

+0

il y a une abstraction fonctionnelle pour cela: Enumerable # all? – tokland

+0

Pourquoi continuer à chercher une fois que vous avez trouvé un élément manquant? – baash05

-1

Cela peut fonctionner

newarray = array1 & array2 
+0

Désolé, il ne peut pas. – Nakilon

0

fin au jeu .. mais

(array2 & array1) === array1 

qui semble fonctionner ..

array1.present? && (array2 & array1) === array1 

si vous voulez retourner vrai si le tableau a des données.

J'ai pris un coup de couteau à l'opérateur ===, comme cela fonctionne dans rspec.

Questions connexes