iOS swift从另一个数组中删除一个数组的元素

Posted

技术标签:

【中文标题】iOS swift从另一个数组中删除一个数组的元素【英文标题】:iOS swift remove elements of an array from another array 【发布时间】:2015-08-13 09:29:43 【问题描述】:

我有两个数组

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

我想从 array1 中删除 array2 的元素

Result ["b", "e"]

【问题讨论】:

【参考方案1】:

@Antonio's solution 性能更高,但如果这很重要,这会保留排序:

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

【讨论】:

喜欢这种方法 好答案!但是你知道如何在 obj-c 上写这个吗?请帮帮我:)谢谢 如果元素是Hashable,就像在这种情况下一样,首先将array2转换为Set可能会更高效;这仍然会保留顺序,因为 array1 仍然是一个数组,但您可以对搜索集合执行快速查找。 要使其工作,您的对象还必须符合 Equatable 协议。如果不是,你会在 Swift 4.0 中得到这个奇怪的错误:Missing argument label 'where:' in call in the contains function in the filter. @c1pherB1t 是的,您可以在contains 中添加where:,即array1 = array1.filter( item in !array2.contains(where: $0.id == item.id ) )【参考方案2】:

最简单的方法是将两个数组转换为集合,从第一个中减去第二个,将结果转换为数组并将其分配回array1

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

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

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

【讨论】:

你能从一个集合中减去一个数组吗?那不需要array1 = Array(Set(array1).subtract(Set(array2)))(在从array1中减去它之前将Array2转换为一个集合?) @DuncanC:subtract 方法(以及许多其他 Set 方法)采用 SequenceType 参数,所以是的,您可以传递一个数组。 我使用:/* Swift 3.x */ func - <Element: Hashable>(lhs: [Element], rhs: [Element]) -> [Element] return Array(Set<Element>(lhs).subtracting(Set<Element>(rhs))) 这真的很好 - 它似乎也尊重原始顺序 - 总是有保证吗? 不保证顺序: > 唯一元素的无序集合。 developer.apple.com/documentation/swift/set【参考方案3】:

使用索引数组删除元素:

    字符串和索引数组

    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"]
    

    整数和索引数组

    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]
    

使用另一个数组的元素值删除元素

    整数数组

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

    字符串数组

    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"]
    

【讨论】:

【参考方案4】:

这是一个带有@jrc 答案的扩展:

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

【讨论】:

不错的方法,但如果你有一百万个条目,这是 n^2【参考方案5】:

超出范围,但如果它在这里,它将对我有所帮助。 从 OBJECTIVE-C

中的数组中删除子数组
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"not (self IN %@)", subArrayToBeDeleted];
NSArray* finalArray = [initialArray filteredArrayUsingPredicate:predicate];

希望它会帮助某人:)

【讨论】:

这不是很有效。只需这样做:[[array1 mutableCopy] removeObjectsInArray:array2]【参考方案6】:

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

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

【讨论】:

intersect 显示共同的元素,我想删除共同的元素并在另一个数组中获取其他元素 我更新了代码,你需要使用减法【参考方案7】:

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)
  

【讨论】:

【参考方案8】:

这是通过定义您自己的 PredicateSet 的另一种解决方案。

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"]

【讨论】:

以上是关于iOS swift从另一个数组中删除一个数组的元素的主要内容,如果未能解决你的问题,请参考以下文章

从另一个数组列表中删除一个数组列表元素的最佳方法

如何在 Swift 中从数组中删除一个元素

Swift 数组删除元素

Swift 3 数组 - 在其他数组的帮助下删除多个元素

在 SpriteKit/Swift 中从数组中删除元素

swift 删除排序数组中的重复项