IOS 迅速从另一个数组中删除数组元素

我有两个数组

var array1 = new Array ["a", "b", "c", "d", "e"]
var array2 = new Array ["a", "c", "d"]

我想从 array1中移除 array2的元素

Result ["b", "e"]
35284 次浏览

您可以创建集合,然后使用减法

let setA = Set(arr1)
let setB = Set(arr2)
setA.subtract(setB)

最简单的方法是将两个数组转换为集合,将第二个数组从第一个数组中减去,将结果转换为一个数组,然后将结果赋给 array1:

array1 = Array(Set(array1).subtracting(array2))

注意,您的代码不是有效的 Swift-您可以使用类型推断来声明和初始化这两个数组,如下所示:

var array1 = ["a", "b", "c", "d", "e"]
var array2 = ["a", "c", "d"]

@ 安东尼奥的解决方案的性能更好,但如果重要的话,它可以保留订单:

var array1 = ["a", "b", "c", "d", "e"]
let array2 = ["a", "c", "d"]
array1 = array1.filter { !array2.contains($0) }

不在范围内,但如果它在这里的话会对我有帮助。 在 Objective-C 中去除阵列中的子阵列

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"not (self IN %@)", subArrayToBeDeleted];
NSArray* finalArray = [initialArray filteredArrayUsingPredicate:predicate];

希望它能帮到别人:)

使用索引数组删除元素:

  1. 字符串和索引数组

    let animals = ["cats", "dogs", "chimps", "moose", "squarrel", "cow"]
    let indexAnimals = [0, 3, 4]
    let arrayRemainingAnimals = animals
    .enumerated()
    .filter { !indexAnimals.contains($0.offset) }
    .map { $0.element }
    
    
    print(arrayRemainingAnimals)
    
    
    //result - ["dogs", "chimps", "cow"]
    
  2. Array of Integers and indexes

    var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    let indexesToRemove = [3, 5, 8, 12]
    
    
    numbers = numbers
    .enumerated()
    .filter { !indexesToRemove.contains($0.offset) }
    .map { $0.element }
    
    
    print(numbers)
    
    
    //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
    



Remove elements using element value of another array

  1. Arrays of integers

    let arrayResult = numbers.filter { element in
    return !indexesToRemove.contains(element)
    }
    print(arrayResult)
    
    
    //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
    
  2. Arrays of strings

    let arrayLetters = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
    let arrayRemoveLetters = ["a", "e", "g", "h"]
    let arrayRemainingLetters = arrayLetters.filter {
    !arrayRemoveLetters.contains($0)
    }
    
    
    print(arrayRemainingLetters)
    
    
    //result - ["b", "c", "d", "f", "i"]
    

下面是带有@jrc 回答的扩展:

extension Array where Element: Equatable {
func subtracting(_ array: Array<Element>) -> Array<Element> {
self.filter { !array.contains($0) }
}
}

沙伊•巴拉西亚诺(Shai Balassiano)的扩展版答案是:

extension Array where Element: Equatable {
func subtracting(_ array: [Element]) -> [Element] {
self.filter { !array.contains($0) }
}


mutating func remove(_ array: [Element]) {
self = self.subtracting(array)
}
}

这里还有一个解决方案,它可以定义您自己的预测集。

struct PredicateSet<A> {
let contains: (A) -> Bool
}


let animals = ["Cow", "Bulldog", "Labrador"]
let dogs = ["Bulldog", "Labrador"]


let notDogs = PredicateSet { !dogs.contains($0) }


print(animals.filter(notDogs.contains)) // ["Cow"]