EDIT: Apoyo Mark Thomas' solución alternativa que utiliza el núcleo Set
class.
Si bien mi solución responde de forma más estricta a la pregunta de cómo hacer esto con las matrices, sjsc puede beneficiarse al revisar su propio caso y explorar la opción de usar conjuntos en su lugar.
Hay muchos métodos válidos para usar matrices (mantener el orden, permitiendo duplicados), para lo cual aún es suficiente, pero si ninguno de ellos está involucrado, sjsc podría beneficiarse de usar Set en lugar de Array, y esa medida, la solución de Mark es semánticamente superior.
No conozco ningún método de biblioteca que lo haga, pero no sería demasiado difícil escribir su propia función.
class Array
def subset?(a)
(self - a).length == 0
end
end
estoy seguro de que hay maneras computacionalmente más eficientes para lograr esto, pero esto se debe hacer lo que usted está buscando.
La intersección de matrices funciona y básicamente equivale a lo mismo.
class Array
def subset?(a)
(self & a).length == length
end
end
Optimización en este nivel no va a ayudar a cuestiones demasiado, pero lo que no quiero hacer es empezar a comparar matrices múltiples veces:
class Array
# don't do this
def subset?(a)
(self & a) == a
end
end
¿Qué versión de Ruby se han utilizado aquí? Me estoy poniendo falso en cada ocasión. irb (main): 006: 0> [1,2,3,4,5,6] .include? ([4,1]) => false irb (main): 007: 0> [4, 1,6,2] .include? ([4,1]) => falso irb (main): 008: 0> [3,4,7] .include? ([4,1]) – ram