Cómo get una list de elementos (no comunes) de 2 matrices en Swift

Esta pregunta es similiar a mi otra

Tengo 2 matrices:

fruitsArray = ["apple", "mango", "blueberry", "orange"] vegArray = ["tomato", "potato", "mango", "blueberry"] 

¿Cómo puedo get los elementos infrecuentes de fruitsArray comparación con vegArray

 Expected Output = ["apple", orange] 

Convierta matrices en Establecer y utilice la function de sustracción () para get lo que desea

  let fruitsArray = ["apple", "mango", "blueberry", "orange"] let vegArray = ["tomato", "potato", "mango", "blueberry"] let set1 = Set(fruitsArray) let set2 = Set(vegArray) let filter = Array(set1.subtract(set2)) println(filter) //[apple, orange] 

Una línea

 let fruitsArray = ["apple", "mango", "blueberry", "orange"] let vegArray = ["tomato", "potato", "mango", "blueberry"] let answer = fruitsArray.filter{ item in !vegArray.contains(item) } print("\(answer)") // ["apple", "orange"] 

En realidad, hay algunas dificultades con esta operación. Primero, hay una diferencia entre las dos cosas que podrías estar pidiendo: ya sea "diferencia" o "resta". La diferencia devolvería los elementos que no están en ambas arrays, por ejemplo:

 let fruitsArray = ["apple", "mango", "blueberry", "orange"] let vegArray = ["tomato", "potato", "mango", "blueberry"] difference(fruitsArray, vegArray) // ["apple", "orange", "tomato", "blueberry"] 

Eso no parece ser lo que estás pidiendo, pero vale la pena tenerlo en count.

La segunda es una "resta", que arrojaría el resultado esperado. Hay una cosa más a tener en count acerca de esto. El obvio:

 fruitsArray.filter{ !vegArray.contains($0) } // ["apple", "orange"] 

Es cuadrático No hay problema si el performance no es importante, pero es fácilmente evitable, utilizando un Set . Ahora, puede convertir ambos y usar los methods normales de Set , pero eso no es necesario. Convertir a un Set es O (n) (creo, no estoy realmente seguro), pero vas a tener que iterar a través del set de fruitsArray todos modos, y convertirlo nuevamente a una matriz al final. La única ventaja de un Set es que tiene un método O (1) contains , por lo que solo necesita convertir el contenido que está usando contains . La forma más eficiente, creo, es:

 let vSet = Set(vegArray) fruitsArray.filter { m in !vSet.contains(m) } 

Potente funcional de una sola línea:

 // Swift 1.2 let differenceResult = fruitsArray.filter({!contains(vegArray, $0)}) // Swift 2.0 let differenceResult = fruitsArray.filter(!vegArray.contains) 

y, obviamente, para su otra pregunta, simplemente elimine el ! :

 // Swift 1.2 let intersectionResult = fruitsArray.filter({contains(vegArray, $0)}) // Swift 2.0 let intersectionResult = fruitsArray.filter(vegArray.contains)