2010-10-09 27 views
17

Supposons que je le code Ruby suivant:Ruby: Array contenu dans Array, un ordre

array_1 = ['a', 'b'] 
array_2 = ['a', 'b', 'c'] 

some_function(array_1, array_2) # => True 
some_function(array_2, array_1) # => False 
some_function(['a', 'b'], ['a', 'd']) # => False 
some_function(['x', 'y'], array_2) # => False 

Je suis à peu près à la recherche d'some_function pour revenir vrai lorsque le paramètre 2 contient tous des éléments dans le paramètre 1 .

Répondre

42
def f a,b 
    (a-b).empty? 
end 
+0

excellent. Merci beaucoup! – Mike

+5

C'est ce que j'aime chez Ruby - si concis, sensible et lisible. –

+0

Viva Ruby ...: D –

-2
def f a,b 
    tmp = a.map(|i| b.include?(i)) 
    tmp.include?(false) 
end 
1

D'un post précédent,

def f a,b 
    (a-b).empty? 
end 

ne fonctionnera pas comme vous l'espériez, par exemple:

a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
a2 = [2, 3, 5, 9] 

(a1-a2).empty? # returns true 

cependant

a1-a2 # returns [1, 4, 6, 7, 8], not empty 

ainsi f retourne false.

Une solution plus précise, si vous voulez un one-liner serait:

def f a,b 
    a&b == b 
end 

a&b retournera tous les éléments qui sont à la fois a et b nous vérifions pour voir si cela est égal à b

Par souci d'ambiguïté:

def f a,b 
    (a&b == a) || (a&b == b) 
end 
+0

C'est parce que vous devriez mettre plus grand tableau en premier lieu. L'auteur demande en fait si le tableau 'a' est un sous-ensemble de' b'. Evidemment, dans votre exemple 'a1' n'est pas un sous-ensemble de' a2' –

+0

'a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]'; 'a2 = [2, 3, 5, 9]'; '(a1-a2) .empty?' # => Retourne 'false' !! ; Ai-je fait quelque chose de mal ou avez-vous ?? – Djunzu