2010-10-09 9 views
17

Supponiamo che io ho il seguente codice Ruby:Rubino: Array contenuta in Array, qualsiasi ordine

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 

sto praticamente cercando some_function per tornare True quando Parametro 2 contiene tutte degli elementi nel Parametro 1 .

risposta

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

eccellente. Grazie mille! – Mike

+5

Questo è quello che mi piace di Ruby: così conciso, sensibile e leggibile. –

+0

Viva Ruby ...: D –

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

Da un post precedente,

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

non funziona nel modo previsto, ad esempio:

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

(a1-a2).empty? # returns true 

tuttavia,

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

quindi f restituisce false.

Una soluzione più accurata, se si desidera una battuta sarebbe:

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

a&b restituirà tutti gli elementi che si trovano in entrambi a e b poi controlliamo per vedere se questo è uguale a b

Per l'amor di ambiguità:

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

Questo è dovuto al fatto che dovresti mettere un array più grande in primo luogo. L'autore in realtà chiede se l'array 'a' è un sottoinsieme di' b'. Ovviamente, nel tuo esempio 'a1' non è un sottoinsieme di' a2' –

+0

'a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]'; 'a2 = [2, 3, 5, 9]'; '(a1-a2) .empty?' # => Restituisce 'false' !! ; Ho fatto qualcosa di sbagliato o l'hai fatto ?? – Djunzu