2016-06-23 4 views
0

У меня есть два массива, для которых я сравниваю [Int]Как удалить одно повторяющееся значение в массиве?

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

Это возвращает массив общих значений в 2-х массивах. Затем я хочу, чтобы пройти и удалить эти значения из каждого массива, который я делаю вот так

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)") 
     } 
    } 
} 

Это прекрасно работает, но, скажем, один из моих массивов содержит две записи для 12 в качестве примера. Как удалить только один из них? В этом случае все записи 12 полностью удаляются.

EDIT

Я теперь сравнивая моих двух массивов с использованием

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

, а затем те commonValues из каждого массива с

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

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

Это гораздо лучше общее решение, но я все еще в конечном итоге столкнулся с той же проблемой, хотя и немного отличающейся от предыдущей.

В детской площадке, к примеру ...

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

тест возвращается содержащий [7, 9], и мне нужно, чтобы сохранить дополнительный 7. Как я могу это сделать?

+0

Если значения в массивах уникальны в пределах themse вы должны подумать об использовании наборов, поскольку они построили методы для этих видов операций. Как показано здесь: http://stackoverflow.com/questions/24589181/set-operations-union-intersection-on-swift-array – Ike10

+0

Вам нужно сохранить порядок массива? – Paulw11

+0

Также одно замечание: структурирование цикла таким образом может вызвать проблемы, так как вы изменяете длину массива при прохождении через него. –

ответ

5

Если порядок массивов не важны, то вы можете легко достичь всего решения, используя наборы:

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

Это гораздо более чистое решение, чем то, что я использовал, но у меня все еще есть проблемы. Похоже, что всякий раз, когда я конвертирую 'Array' в' Set', он объединяет общие значения. '[7, 7, 9]', например, становится '[7, 9]' после преобразования – Coltrane

2

Если порядок важен, используйте NSOrderedSet:

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

let result = NSOrderedSet(array: (strongAgainstArray + weakAgainstArray)).array 
Смежные вопросы