2016-06-23 20 views
0

Ich habe zwei Arrays für die ich bin zu vergleichen [int]Wie entfernt man einen doppelten Wert in einem Array?

let filter = strongAgainstArray.filter{weakAgainstArray.contains($0)} 

Dieses eine Anordnung von gemeinsamen Werte in den Arrays 2 zurückgibt. Ich möchte dann durch gehen und diese Werte aus jedem Array zu entfernen, was ich wie so tue

for item in filter { 
    for var i = 0; i < strongAgainstArray.count; i += 1 { 
     if item == strongAgainstArray[i] { 
      strongAgainstArray.removeAtIndex(i) 
      print("Removing a Strong against index \(item)") 
     } 
    } 
    for var i = 0; i < weakAgainstArray.count; i += 1 { 
     if item == weakAgainstArray[i] { 
      weakAgainstArray.removeAtIndex(i) 
      print("Removing a Weak against index \(item)") 
     } 
    } 
} 

fein Dies funktioniert, aber sagen wir mal eine meiner Arrays für 12 als Beispiel zwei Einträge enthält. Wie entferne ich nur einen von ihnen? So wie es aussieht, werden alle Einträge von 12 vollständig entfernt.

EDIT

ich jetzt meine zwei Arrays zu vergleichen mit

let commonValues = Array(Set(strongAgainstArray).intersect(weakAgainstArray))

und dann diejenigen commonValues von jedem Array mit

cleanStrongAgainstArray = Array(Set(strongAgainstArray).subtract(Set(commonValues)).sort()) 

cleanWeakAgainstArray = Array(Set(weakAgainstArray).subtract(Set(commonValues)).sort()) 

Dies ist eine viel bessere Gesamtlösung, aber ich stoße immer noch auf das gleiche Problem, wenn auch etwas anders als zuvor.

Auf dem Spielplatz, zum Beispiel ...

let array = [7,7,9] 
let test = Array(Set(array)) 

Test kommt wieder [7, 9] enthält, und ich brauche, dass zusätzliche 7. halten Wie kann ich das tun?

+0

Wenn die Werte in Ihrem Arrays sind einzigartig innerhalb themse lves sollten Sie Sets verwenden, da sie Methoden für diese Art von Operationen enthalten. Wie hier gezeigt: http://stackoverflow.com/questions/24589181/set-operations-union-intersection-on-swift-array – Ike10

+0

Müssen Sie die Reihenfolge des Arrays halten? – Paulw11

+0

Auch eine Sache zu beachten, Strukturierung Ihrer Schleife wie diese kann Probleme verursachen, da Sie die Länge des Arrays ändern, während es durchschleifen. –

Antwort

5

Wenn die Reihenfolge der Arrays nicht wichtig ist, dann können Sie bequem die gesamte Lösung mit Sets erreichen:

let dirtyArray = [1,4,6,1,56,4,4,66,23,3,3,12] 
let dirtyArray1 = [3,1,6,99,54] 

let cleanArray = Array(Set(dirtyArray).union(Set(dirtyArray1))) 

print (cleanArray) 

[12, 54, 23, 4, 6, 66, 99, 56 , 1, 3]

+0

Dies ist eine viel sauberere Lösung als das, was ich verwendet habe, aber ich habe immer noch Probleme. Es sieht so aus, als würde ich jedes Mal ein 'Array' in' Set' umwandeln. Es kombiniert allgemeine Werte. "[7, 7, 9]" zum Beispiel wird nach der Konvertierung zu [7, 9] – Coltrane

2

Wenn Reihenfolge ist wichtig, verwenden NSOrderedSet:

let strongAgainstArray = [1, 2, 3, 4] 
let weakAgainstArray = [3, 4, 5, 6] 

let result = NSOrderedSet(array: (strongAgainstArray + weakAgainstArray)).array 
Verwandte Themen