2016-12-14 2 views
2

J'ai un besoin en ce moment, Cette exigence est d'utiliser un tableau de données dans un autre filtre de tableau avec NSPredicate. Dans Object-C il est fonctionne comme ci-dessous:je veux array tableau de filtres par NSPredicate de swift3.0

NSArray * arr1 = @[@1,@2,@3]; 

NSArray * arr2 = @[@2,@3,@4,@5]; 

NSPredicate * filterPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",arr1]; 

NSArray * filter = [arr2 filteredArrayUsingPredicate:filterPredicate]; 

Par cette méthode, je peux obtenir filtre, T il des éléments dans ce tableau ne sont pas inclus dans le arr1.But je ne peux pas trouver des méthodes liées à Swift 3.0 . Si je peux obtenir toute l'aide, je l'apprécierais beaucoup

+0

Il n'y a presque jamais une raison d'utiliser 'NSArray' à Swift et' NSPredicate' peuvent être remplacés par des conceptions beaucoup plus simples, la plupart du temps – Alexander

+0

Comme presque tous les cas de traduction (pour les langages de programmation et humaine **) ** n'essayez pas d'échanger chaque mot contre son équivalent. Au lieu de cela, comprenez la sémantique (le sens) de la phrase, puis traduisez-la en une nouvelle phrase qui correspond le mieux à la nouvelle langue. Ce n'est pas nécessairement du tout semblable à la phrase source, mais cela donne un bien meilleur résultat. – Alexander

Répondre

3

Pour cela vous pouvez simplement utiliser filter pas besoin d'utiliser NSPredicate.

let array1 = [1,2,3] 
let array2 = [2,3,4,5] 
let filterArray = array2.filter { !array1.contains($0) } 
print(filterArray) // [4, 5] 

Edit: Comme @Alexander a suggéré la pâte si vous utilisez permet également de sélectionner array1.

let array1 = [1,2,3,2,3] 
let set = Set(array1) 
let array2 = [2,3,4,5] 
let filterArray = array2.filter { !set.contains($0) } 
print(filterArray) 
+1

@chenbo Note, pour toute taille de tableau non trivial, il est BEAUCOUP meilleur de convertir d'abord 'array1' en Set. Cela va accélérer cet algorithme O (N^2) à O (N), ce qui améliore grandement les performances. – Alexander

+0

@AlexanderMomchliov Bonne suggestion mais je pense que 'contains' n'ira pas plus loin s'il correspond au premier il reviendra et ne sera pas vérifié pour les éléments restants. –

+0

Il le fait, mais cela ne réduit en rien la complexité de calcul. En supposant une distribution uniforme, dans laquelle l'élément désiré est également susceptible d'être dans n'importe quelle position du tableau, en moyenne, il sera trouvé à mi-chemin (certains plus tôt, certains plus tard, mais à mi-chemin en moyenne). Ce sont les opérations de recherche 'array2.count/2', répété' array2.count' fois (un tour par élément de 'array2', donc vous obtenez une complexité totale de' O (array2.count/2 * array2.count) ' , qui est 'O (N^2)' – Alexander