2011-05-04 10 views
14

¿Hay algún método para verificar si la matriz A contiene todos los elementos de la matriz B?Ruby: la matriz A contiene todos los elementos de la matriz B

+2

Muestra un ejemplo de matrices que deseas comparar. ¿Quiere decir que la matriz A puede contener los mismos elementos con la misma cantidad de elementos o solo los mismos elementos y una cantidad diferente de ellos? – fl00r

+2

¿Le preocupa la repetición? Por ejemplo, a sea be [1,2,3,4] y b be [1,1,2]. ¿Cuál debería ser el valor de retorno? – Serabe

Respuesta

7

Esto debería funcionar para lo que necesita:

(a & b) == b 
+4

esto no funcionará como una regla. 'a = [1,2,2,1,3]; b = [3,2,1]; (a & b) == b => false' – fl00r

+1

Sí, pero 'a = [1,2,2,1,3]; b = [3,2,1]; (a & b) .sort == b.sort => true' –

+0

@the Tin Man, sí, pero a = [1,2,2,1,3]; b = [3,2,2,1]; (a & b) .sort == b.sort => falso – fl00r

18

puede probar esta

a.sort.uniq == b.sort.uniq 

o

(a-b).empty? 

Y si [1,2,2] != [1,2] en su caso, usted puede:

a.group_by{|i| i} == b.group_by{|i| i} 
+9

+1 para '(ab) .empty?' –

+2

Por si acaso alguien termina aquí: * * estos están todos mal **. La respuesta correcta es '(b-a) .empty?', No al revés. Otros simplemente están equivocados. Ver también http://stackoverflow.com/questions/7387937/ruby-rails-how-to-determine-if-one-array-contains-all-elements-of-another-array – oseiskar

+0

@oseiskar no, no están mal . Depende de la tarea. – fl00r

2

También existe la clase Set (parte de la biblioteca estándar) que le permite simplemente verificar si B es un subconjunto de A, p. Ej.

>> a = [1,2,3,4,5]  => [1, 2, 3, 4, 5] 
>> b = [3,4,5]   => [3, 4, 5] 
>> require 'set'   => true 
>> set_a = a.to_set  => #<Set: {1, 2, 3, 4, 5}> 
>> set_b = b.to_set  => #<Set: {3, 4, 5}> 

>> set_b.subset? set_a => true 

http://www.ruby-doc.org/stdlib/libdoc/set/rdoc/index.html

0

Es posible que desee echa un vistazo a la clase Set en la biblioteca estándar de Ruby. El método proper_subset? probablemente hará lo que quieras.

6

Se puede utilizar la clase de Ruby Set:

>> require 'set' #=> true 
>> a = [*1..5] #=> [1, 2, 3, 4, 5] 
>> b = [*1..3] #=> [1, 2, 3] 
>> a.to_set.superset? b.to_set #=> true 

Para los pequeños arreglos que suele hacer lo mismo que lo fl00r sugirió:

>> (b-a).empty? #=> true 
5

prefiero hacerlo a través de: (b - a).blank? # dice que b está en un

+0

es más elegante ¡Gracias! – RockStar

4

La manera más simple es la siguiente:

(b-a).empty? 
Cuestiones relacionadas