web-dev-qa-db-fra.com

Définissez les opérations (union, intersection) sur Swift array?

Existe-t-il des appels de bibliothèque standard que je peux utiliser pour effectuer des opérations de définition sur deux baies, ou mettre en œuvre cette logique moi-même (idéalement de la manière la plus fonctionnelle et la plus efficace possible)?

93
devios1

Oui, Swift a la classe Set.

let array1 = ["a", "b", "c"]
let array2 = ["a", "b", "d"]

let set1:Set<String> = Set(array1)
let set2:Set<String> = Set(array2)

Swift 3.0+ peut effectuer des opérations sur des ensembles en tant que:

firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr

Swift 2.0 peut calculer sur des arguments de tableau:

set1.union(array2)       // {"a", "b", "c", "d"} 
set1.intersect(array2)   // {"a", "b"}
set1.subtract(array2)    // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}

Swift 1.2+ peut calculer sur des sets:

set1.union(set2)        // {"a", "b", "c", "d"}
set1.intersect(set2)    // {"a", "b"}
set1.subtract(set2)     // {"c"}
set1.exclusiveOr(set2)  // {"c", "d"}

Si vous utilisez des structures personnalisées, vous devez implémenter Hashable.

Merci à Michael Stern dans les commentaires pour la mise à jour Swift 2.0.

Merci à Amjad Husseini dans les commentaires pour l'info Hashable.

169

Vous voudrez peut-être suivre le même schéma que dans Objective-C, qui manque également de telles opérations, mais il existe une solution de contournement simple:

comment intersecter deux tableaux dans l'objectif C?

0
Alexey

La méthode la plus efficace que je connaisse consiste à utiliser des nombres de Godel. Google pour l'encodage de godel.

L'idée est tellement. Supposons que vous avez N nombres possibles et que vous devez en faire des ensembles. Par exemple, N = 100 000 et souhaitez créer des ensembles tels que {1,2,3}, {5, 88, 19000}, etc.

L'idée est de garder en mémoire la liste des N nombres premiers et pour un ensemble donné {a, b, c, ...} vous l'encodez comme

 prime[a]*prime[b]*prime[c]*...

Donc, vous encodez un ensemble en tant que BigNumber. Les opérations avec BigNumbers, bien qu'elles soient plus lentes que celles avec Integers, sont toujours très rapides.

Pour réunir 2 ensembles A, B, vous prenez

  UNITE(A, B) = lcm(a, b)

le plus petit commun-multiple de A et B, car A et B sont des ensembles et les deux nombres.

Pour faire l'intersection que vous prenez

 INTERSECT(A, B) = gcd (a, b)

plus grand diviseur commun.

etc.

Cet encodage s'appelle godelization, vous pouvez en rechercher plus pour google, tout le langage de l'arithmétique écrit en utilisant la logique de Frege peut être encodé en utilisant des nombres de cette façon.

Pour obtenir l'opération is-member? c'est très simple --

ISMEMBER(x, S) = remainder(s,x)==0

Pour obtenir le cardinal c'est un peu plus compliqué -

CARDINAL(S) = # of prime factors in s

vous décomposez le nombre S représentant l'ensemble en produit de facteurs premiers et ajoutez leurs exposants. Si l'ensemble ne permet pas les doublons, vous aurez tous les exposants 1.

0
alinsoar

Il n’ya pas d’appel de bibliothèque standard, mais vous voudrez peut-être consulter la bibliothèque ExSwift . Il inclut un tas de nouvelles fonctions sur les tableaux, notamment la différence, l'intersection et l'union.

0
Connor