Swift: determina si Array1 contiene al less un object de Array2

Tengo 2 arreglos. Digamos, array1 = [1,2,3,4,5] y array2 = [2,3] . ¿Cómo podría comprobar swift si array1 contiene al less un elemento de array2 ?

Puede hacer esto simplemente pasando la array2 su array2 contains en la function de su array1 (o viceversa), ya que sus elementos son Equatable .

 let array1 = [2, 3, 4, 5] let array2 = [20, 15, 2, 7] // this is just shorthand for array1.contains(where: { array2.contains($0) }) if array1.contains(where: array2.contains) { print("Array 1 and array 2 share at least one common element") } else { print("Array 1 doesn't contains any elements from array 2") } 

Esto funciona haciendo un ciclo a través de los elementos de la matriz 1. Para cada elemento, luego recorrerá la matriz 2 para verificar si existe en esa matriz. Si encuentra ese elemento, se romperá y devolverá verdadero; de lo contrario, será falso.

Esto funciona porque en realidad hay dos sabores de contains . Se toma un cierre para verificar cada elemento contra un pnetworkingicado personalizado, y el otro solo compara un elemento directamente. En este ejemplo, array1 está utilizando la versión de cierre , y array2 está utilizando la versión de elemento . Y esa es la razón por la que puede pasar una function contains a otra que contains function.


Aunque, como lo señaló correctamente @AMomchilov , el algorithm anterior es O (n 2 ). Un buen algorithm de intersección es O (n), ya que la búsqueda de elementos es O (1). Por lo tanto, si su código es crítico para el performance, definitivamente debería usar sets para hacer esto (si sus elementos son Hashable ), como lo muestra @simpleBob .

Aunque si quieres aprovechar la salida anticipada que contains te da, querrás hacer algo como esto:

 extension Sequence where Iterator.Element : Hashable { func intersects<S : Sequence>(with sequence: S) -> Bool where S.Iterator.Element == Iterator.Element { let sequenceSet = Set(sequence) return self.contains(where: sequenceSet.contains) } } 

 if array1.intersects(with: array2) { print("Array 1 and array 2 share at least one common element") } else { print("Array 1 doesn't contains any elements from array 2") } 

Esto funciona de forma muy parecida a la utilización del método contains contains de la matriz, con la importante diferencia de que el método arraySet.contains ahora es O (1). Por lo tanto, todo el método ahora se ejecutará en O (n) (donde n es la mayor longitud de las dos secuencias), con la posibilidad de salir temprano.

Una forma alternativa sería usar Set :

 let array1 = [1,2,3,4,5] let array2 = [2,3] let set1 = Set(array1) let intersect = set1.intersect(array2) if !intersect.isEmpty { // do something with the intersecting elements } 
 let a1 = [1, 2, 3] let a2 = [2, 3, 4] 

Opción 1

 a2.filter { a1.contains($0) }.count > 1 

opcion 2

 a2.networkinguce(false, combine: { $0 || a1.contains($1) }) 

# 1 Usar el isDisjoint(with:) Set isDisjoint(with:)

Con Swift 4, Set tiene un método llamado isDisjoint(with:) . isDisjoint(with:) tiene la siguiente statement:

 func isDisjoint<S>(with other: S) -> Bool where Int == S.Element, S : Sequence 

Devuelve un valor boolean que indica si el set no tiene miembros en común con la secuencia dada.

Para probar si dos arrays no tienen elementos comunes, puede utilizar el código siguiente del patio de juegos que usa isDisjoint(with:) :

 let array1 = [1, 3, 6, 18, 24] let array2 = [50, 100, 200] let hasNoCommonElement = Set(array1).isDisjoint(with: array2) print(hasNoCommonElement) // prints: true 

# 2 Usando Set intersection(_:) método

Con Swift 4, Set tiene un método llamado intersection(_:) . intersection(_:) tiene la siguiente statement:

 func intersection<S>(_ other: S) -> Set<Set.Element> where Element == S.Element, S : Sequence 

Devuelve un nuevo set con los elementos que son comunes tanto a este set como a la secuencia dada.

Para probar si dos arrays tienen uno o más elementos comunes, puede utilizar el código de la zona de juegos a continuación que usa la intersection(_:) :

 let array1 = [1, 3, 6, 18, 24] let array2 = [2, 3, 18] let intersection = Set(array1).intersection(array2) print(intersection) // prints: [18, 3] let hasCommonElement = !intersection.isEmpty print(hasCommonElement) // prints: true 
Intereting Posts