2015-04-13 14 views

Antwort

13

wie diese zu nehmen:

var arrayA = ["Mike", "James", "Stacey", "Steve"] 
var arrayB = ["Steve", "Gemma", "James", "Lucy"] 
for word in arrayB { 
    if let ix = find(arrayA, word) { 
     arrayA.removeAtIndex(ix) 
    } 
} 
// now arrayA is ["Mike", "Stacey"] 
+1

Dies erwies sich als die richtige Antwort, danke. –

+7

Diese Lösung funktioniert ziemlich gut für kleine Arrays, aber es muss berücksichtigt werden, dass ihre Komplexität O (n^2) ist. Bei größeren Arrays würde ich 'arrayA' in ein Set konvertieren und es für' find' verwenden - das sollte die Komplexität auf 0 (2n) reduzieren. – Antonio

24

Der einfachste Weg ist durch den neuen Set Behälter mit (hinzugefügt in Swift 1.2/Xcode 6.3):

var setA = Set(arrayA) 
var setB = Set(arrayB) 

// Return a set with all values contained in both A and B 
let intersection = setA.intersect(setB) 

// Return a set with all values in A which are not contained in B 
let diff = setA.subtract(setB) 

Wenn Sie die Ergebnismenge zu arrayA, erstellen Sie einfach eine neue Instanz mit der Kopie neu zuweisen möchten Konstruktor und weisen es arrayA:

arrayA = Array(intersection) 

Der Nachteil ist, dass Sie zwei neue Datensätze erstellen haben. Beachten Sie, dass intersect nicht die Instanz mutiert, in der es aufgerufen wird, es gibt nur eine neue Menge zurück.

gibt es ähnliche Methoden addieren, subtrahieren, etc., können Sie einen Blick auf sie

+0

Sorry ich habe noch nie benutzt Stellen Sie vorher ein. Ich habe es gerade in den Spielplatz geworfen und es heißt: 'Verwendung des unaufgelösten Identifikators 'Set''. Können Sie mehr ausarbeiten? –

+0

Forgot zu erwähnen, dass es in Swift 1.2 verfügbar ist - ich nehme an, Sie verwenden nicht Xcode 6.3 – Antonio

+0

Ahh Ok, Sie gehen davon aus, ich werde heute Abend aktualisieren und es ausprobieren. Danke für Ihre Hilfe. –

9

ich mit Antonio Antwort einverstanden sind, aber für kleine Array Subtraktionen können Sie auch verwenden, um eine Schließung des Filters wie folgt aus:

let res = arrayA.filter { !contains(arrayB, $0) } 
+0

Das ist schön, weil es die Reihenfolge beibehält – Alexander

4

Dies kann auch als minus func implementiert werden:

func -<T:RangeReplaceableCollectionType where T.Generator.Element:Equatable>(lhs:T, rhs:T) -> T { 

    var lhs = lhs 
    for element in rhs { 
     if let index = lhs.indexOf(element) { lhs.removeAtIndex(index) } 
    } 

    return lhs 
} 

Jetzt können Sie verwenden

arrayA - arrayB 
25

@ Esco-vadicamo Antwort in Swift 2/3/4 +

arrayA = arrayA.filter { !arrayB.contains($0) } 
+0

Sollte 'arrayB' noch zu' Set 'machen 'zuerst. – BallpointBen

+0

@BallpointBen warum? Das ist nicht, was OP fragte –

+0

@BallpointBen Ich habe einen Demo-Link auf die Antwort hinzugefügt: wie Sie sehen können, funktioniert es wie erwartet. –

9

matt und Freytag-Lösungen sind die einzigen, die für Duplikate Konto und sollte mehr als 1s erhalten als die anderen Antworten.

Hier ist eine aktualisierte Version der Antwort von matt für Swift 3.0:

var arrayA = ["Mike", "James", "Stacey", "Steve"] 
var arrayB = ["Steve", "Gemma", "James", "Lucy"] 
for word in arrayB { 
    if let ix = arrayA.index(of: word) { 
     arrayA.remove(at: ix) 
    } 
} 
2

Mit dem Array → Set → Array Methode von Antonio erwähnt, und mit dem Komfort eines Bedieners, wie Freytag wies darauf hin, habe ich sehr zufrieden mit diesem:

// Swift 3.x 
func - <Element: Hashable>(lhs: [Element], rhs: [Element]) -> [Element] 
{ 
    return Array(Set<Element>(lhs).subtracting(Set<Element>(rhs))) 
} 
1

Hier sind dieselben Operationen mit Array von ganzen Zahlen Swift 3

var array1 = [1, 2, 3, 4, 5, 6] 

var array2 = [1,5] 

var arrayResult = array1.enumerated() 
    .filter { !array2.contains($0.0 + 1) } 
    .map { $0.1 } 

print(arrayResult) 

[2, 3, 4, 6]


andere Möglichkeiten, um das gleiche Ergebnis zu erzielen:

1. Verwenden Filter

let arrayResult = array1.filter { element in 
    return !array2.contains(element) 
} 

2. Verwenden Sort

array2.sorted(by: >).forEach { if $0 < self.array1.count { self.array1.remove(at: $0) } } 
Verwandte Themen