Dado:
a1 = [5, 1, 6, 14, 2, 8]
Me gustaría determinar si contiene todos los elementos de:
a2 = [2, 6, 15]
En este caso el resultado es false
.
¿Hay algún método incorporado de Ruby / Rails para identificar dicha inclusión de matriz?
Una forma de implementar esto es:
a2.index{ |x| !a1.include?(x) }.nil?
¿Hay una manera mejor y más legible?
ruby-on-rails
arrays
ruby
Misha Moroshko
fuente
fuente
Respuestas:
fuente
(a2-a1).empty?
(a2.uniq - a1.uniq).empty?
Quizás esto sea más fácil de leer:
También puede usar la intersección de matriz:
Tenga en cuenta que
size
se usa aquí solo para la velocidad, también puede hacer (más lento):Pero supongo que el primero es más legible. Estos 3 son rubí simple (no rieles).
fuente
Esto se puede lograr haciendo
Esto crea la intersección de ambas matrices, devolviendo todos los elementos desde los
a2
cuales también se encuentrana1
. Si el resultado es el mismoa2
, puede estar seguro de que tiene todos los elementos incluidosa1
.Este enfoque solo funciona si todos los elementos
a2
son diferentes entre sí en primer lugar. Si hay dobles, este enfoque falla. El de Tempos todavía funciona entonces, así que recomiendo su enfoque (también es probablemente más rápido).fuente
length
método funcionará mucho mejorSi no hay elementos duplicados o no le importan, puede usar la clase Set :
Detrás de escena esto usa
fuente
Puede parchear la clase Array:
prueba
Por supuesto, el método puede escribirse como un método estándar solo, p. Ej.
y puedes invocarlo como
De hecho, después de la creación de perfiles, la siguiente versión es mucho más rápida y el código es más corto.
fuente
Dependiendo de qué tan grandes sean sus matrices, podría considerar un algoritmo eficiente O (n log n)
La clasificación cuesta O (n log n) y la comprobación de cada par cuesta O (n), por lo tanto este algoritmo es O (n log n). Los otros algoritmos no pueden ser más rápidos (asintóticamente) usando matrices sin clasificar.
fuente
La mayoría de las respuestas basadas en (a1 - a2) o (a1 y a2) no funcionarían si hay elementos duplicados en cualquier matriz. Llegué aquí buscando una manera de ver si todas las letras de una palabra (divididas en una matriz) eran parte de un conjunto de letras (por ejemplo, scrabble). Ninguna de estas respuestas funcionó, pero esta sí:
fuente