2016-12-14 4 views
2

Ich habe eine Notwendigkeit, jetzt diese Anforderung ist ein Array von Daten in einem anderen Array-Filter mit NSPredicate zu verwenden. In Object-C es funktioniert wie unten:Ich möchte Array-Filter-Array von NSPredicate von 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]; 

Durch dieses Verfahren kann ich Filter, T er Elemente in diesem Array sind nicht im arr1.But enthält wir nicht verwandte Methoden auf Swift finden 3.0 . Wenn ich alle Hilfe bekommen kann, würde ich es sehr schätzen

+0

Es gibt fast nie einen Grund 'NSArray' in Swift zu verwenden, und' NSPredicate' mit viel einfacheren Designs ersetzt werden, die meiste Zeit – Alexander

+0

Wie bei fast allen Fällen der Übersetzung (für beide Programmiersprachen und Menschen Sprachen), ** versuche nicht, jedes Wort gegen sein Gegenstück auszutauschen. Verstehen Sie stattdessen die Semantik (die Bedeutung) der Phrase und übersetzen Sie sie dann in eine neue Phrase, die am besten zur neuen Sprache passt. Es ist nicht unbedingt der Quellphrase ähnlich, aber es ergibt ein viel besseres Ergebnis. – Alexander

Antwort

3

Dafür können Sie einfach verwenden filter keine Notwendigkeit, NSPredicate zu verwenden.

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

Edit: Als @Alexander Teig vorgeschlagen, wenn Sie auch mit array1 Satz verwenden.

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 Beachten Sie, dass es für jede nicht-triviale Array-Größe VIEL besser ist, zuerst 'array1' in ein Set zu konvertieren. Es wird diesen O (N^2) -Algorithmus zu O (N) beschleunigen, was zu einer enormen Verbesserung der Leistung führt. – Alexander

+0

@AlexanderMomchliov Guter Vorschlag, aber ich denke 'contains' wird nicht weiter gehen, wenn es mit dem ersten übereinstimmt, wird es zurückkehren und nicht auf verbleibende Elemente überprüft. –

+0

Es tut das, aber das reduziert überhaupt nicht die Rechenkomplexität. Unter der Annahme einer gleichmäßigen Verteilung, bei der sich das gewünschte Element an jeder Position des Arrays gleichermaßen befindet, wird es im Mittel gefunden (einige früher, einige später, aber die Hälfte im Durchschnitt). Das sind 'array2.count/2' Suchoperationen, die' array2.count' mal wiederholen (eine Runde pro Element von 'array2', so dass Sie eine Gesamtkomplexität von' O (array2.count/2 * array2.count) 'erhalten , die für die, gute Erklärung :) – Alexander

Verwandte Themen