ruby set-difference

¿Cómo hacer una sana "diferencia de diferencia" en Ruby?



set-difference (1)

Demostración (espero resultado [3] ):

[1,2] - [1,2,3] => [] # Hmm [1,2,3] - [1,2] => [3] # I see a = [1,2].to_set => #<Set: {1, 2}> b = [1,2,3].to_set => #<Set: {1, 2, 3}> a - b => #<Set: {}> WTF!

Y:

[1,2,9] - [1,2,3] => [9] # Hmm. Would like [[9],[3]]

¿Cómo se puede realizar una diferencia de conjunto real independientemente del orden de las entradas?

PD. Como un aparte, necesito hacer esto para dos arreglos de 2000 elementos. Generalmente, la matriz # 1 tendrá menos elementos que la matriz # 2, pero esto no está garantizado.


El operador aplicado a dos matrices a y b proporciona el complemento relativo de b en a (elementos que están en a pero no en b ).

Lo que está buscando es la diferencia simétrica de dos conjuntos (la unión de ambos complementos relativos entre los dos). Esto hará el truco:

a = [1, 2, 9] b = [1, 2, 3] a - b | b - a # => [3, 9]

Si está operando en objetos Set , puede usar el operador ^ sobrecargado:

c = Set[1, 2, 9] d = Set[1, 2, 3] c ^ d # => #<Set: {3, 9}>

Para mayor diversión, también puede encontrar el complemento relativo de la intersection en la union de los dos conjuntos:

( a | b ) - ( a & b ) # => #<Set: {3, 9}>