У меня есть два массива, как это:
var arrayA = ["Mike", "James", "Stacey", "Steve"]
var arrayB = ["Steve", "Gemma", "James", "Lucy"]
Как вы можете видеть, Джеймс
и матч Стив и я хочу быть в состоянии удалить их из
arrayA`. Как бы я пишу это?
@Франческо-vadicamo'ы ответ в Свифт 2/3/4+
arrayA = arrayA.filter { !arrayB.contains($0) }
Самый простой способ сделать это с помощью контейнера нового "набора" (добавлено в 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)
Если вы хотите переназначить полученное значение arrayA, просто создайте новый экземпляр, используя конструктор копирования и назначить его arrayA
:
arrayA = Array(intersection)
Недостатком является то, что вы должны создать 2 новые наборы данных.
Обратите внимание, что пересечение
не'т мутировать экземпляр он вызывается, он просто возвращает новый набор.
Существуют аналогичные методы для добавления, вычитания и т. д., вы можете взглянуть на них
Как это:
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"]
Я согласен с Антонио'ы ответ, однако для небольших блока вычитания также можно использовать закрытие фильтра такой:
let res = arrayA.filter { !contains(arrayB, $0) }
Мэтт и Фрайтаг's решения только на счет дубликатов и должны получать больше +1С, чем другие ответы.
Вот обновленная версия Мэтт'ы ответ для 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)
}
}
Оригинальный ответ
Это также может быть реализован как минус Функ:
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
}
Теперь вы можете использовать
arrayA - arrayB
Обновленная реализация для Swift 5
``Свифт Функ -<Т: RangeReplaceableCollection>(лхс: Т РИТ: Т) -> Т где Т. итератора.Элемент: Equatable {
ВАР лхс = лхс для элемента в РГО { если индекс = лхс.firstIndex(из: элемент) { лхс.удалить(по адресу: индекс) } }
возвращение лхс } ``
С помощью выбора → метод set массива → - отметил Антонио, и с удобством оператора, как Фрейтаг отметил, Я'вэ были очень довольны использованием этого:
// Swift 3.x/4.x
func - <Element: Hashable>(lhs: [Element], rhs: [Element]) -> [Element]
{
return Array(Set<Element>(lhs).subtracting(Set<Element>(rhs)))
}
Удалять элементы с помощью индексов массива:
пусть животные = [с"Кошки" В, С "собаки" В, С "мартышки" В, С "лось" и "Ну squarrel-то", то "корова" и] пусть indexAnimals = [0, 3, 4] пусть arrayRemainingAnimals = животные .перечислимые() .фильтр { !indexAnimals.содержит($0.зачет) } .карта { $0.элемент }
печати(arrayRemainingAnimals)
//результат - [с"собаки" В, С "мартышки" В, С "корова" и]
цифры ВАР= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] пусть indexesToRemove = [3, 5, 8, 12]
цифры = цифры .перечислимые() .фильтр { !indexesToRemove.содержит($0.зачет) } .карта { $0.элемент }
печати(номера)
//результате - [0, 1, 2, 4, 6, 7, 9, 10, 11]
<БР><БР> Удалить элементы, используя значение элемента другого массива
пусть arrayResult = цифры.фильтр { элемент в возвращение !indexesToRemove.содержит(элемент) } печати(arrayResult)
//результате - [0, 1, 2, 4, 6, 7, 9, 10, 11]
пусть arrayLetters = ["А", то "в”, на "в себе", на "Д" В, С "Е" В, С "Ф" В, С "Г" В, С "Ч" и "Я" и] пусть arrayRemoveLetters = ["А", то "Е" В, С "Г" В, С "Ч" и] пусть arrayRemainingLetters = arrayLetters.фильтр { !arrayRemoveLetters.содержит($0) }
печати(arrayRemainingLetters)
//результат - ["и в”, на "в себе", то "Д" В, С "Е" и "Я" и]
Для небольших массивов я использую:
`` / poormans Sub для массивов /
расширение массив, где элемент: Equatable {
статические функции=(лхс: массив Барселона, ВП: блок) {
РХС.по каждому элементу { если да indexOfhit = лхс.firstIndex(от: $0) { лхс.удалить(по адресу: indexOfhit) } } }
статические функции(лхс: блок, ВП: блок) -> массив {
возвращение лхс.фильтр { возвращение !РХС.содержит($0) } } } ``