2010-11-16 10 views
10

Tengo dos matrices de cadenas, y me gustaría encontrar el conjunto de cadenas no en la intersección de ambas. El equivalente de SETXOR en MATLAB es lo que quiero: http://www.mathworks.com/help/techdoc/ref/setxor.html¿Hay una función Ruby para realizar una operación XOR en dos conjuntos de cadenas?

Estoy usando el término conjunto indistintamente con Array.

Por supuesto, podría haber escrito tan fácilmente el mío en el tiempo necesario para formar esta pregunta, pero pensé que debería preguntar.

Respuesta

18
array1 + array2 - (array1 & array2) 

Fue más corto, que escribir una pregunta ...

Por cierto, Ruby tiene una clase Set, así que es mejor no usar esta palabra como sinónimo de una matriz.

+0

Esto es tan hermoso. Gracias. –

+0

Esto es hermoso. Bien hecho. –

10

Sí, como dice Nakilon, Set.

require 'set' 
s = Set.new('a'..'f') 
a = ['f','d','e','e','h','i'] #or any enum 
p s^a #=> #<Set: {"h", "i", "a", "b", "c"}> 
+0

¿Cuál es el propósito de tener Set como una estructura de datos? Gracias por tu solución. –

+1

Un conjunto es una colección de valores, sin duplicados. Presenta inserción rápida, eliminación y prueba de membresía. Al menos el último es útil para tu pregunta. – steenslag

+0

El conjunto es una clase poco apreciada, por razones que da @steenslag. Lamentablemente^no parece tener un alias ('exclusive_or' sería ideal) a diferencia de los otros operadores de Set – MatzFan

1

siempre puede hacer

(array0 - array1) + (array1 - array0) 

a = [1, 2, 3, 4, 5] 
b = [2, 5, 8] 
(a - b) + (b - a) 
    # => [1, 3, 4, 8] 
Cuestiones relacionadas