【问题标题】:How to remove elements from array that match elements in another array如何从数组中删除与另一个数组中的元素匹配的元素
【发布时间】:2014-08-11 19:23:38
【问题描述】:

如何从数组中删除与另一个数组中的元素匹配的元素?

假设我们有一个数组,我们遍历它并找出要删除的元素:

var sourceItems = [ ... ]
var removedItems = [SKShapeNode]()

for item : SKShapeNode in sourceItems {
    if item.position.y > self.size.height {
        removedItems.append(item)
        item.removeFromParent()
    }
}

sourceItems -= removedItems // well that won't work.

【问题讨论】:

    标签: arrays swift


    【解决方案1】:

    您可以使用filter 函数。

    let a = [1, 2, 3]
    let b = [2, 3, 4]
    
    let result = a.filter { element in
        return !b.contains(element)
    }
    

    result 将是 [1]

    或者更简洁...

    let result = a.filter { !b.contains($0) }

    查看Swift Standard Library Reference

    或者您可以使用Set 类型。

    let c = Set<Int>([1, 2, 3])
    let d = Set<Int>([2, 3, 4])
    c.subtract(d)
    

    【讨论】:

    • 谢谢克里斯,太棒了!
    • Chris 有变异过滤器吗?那会从数组中删除它而不是返回新数组?
    • 我不这么认为。您对将返回值分配给您的引用有什么顾虑?
    • 好吧,避免重新分配内存和重用现有的内存会更便宜,但似乎 swift 数组并非如此。
    • 之前在 Swift 1.x 中我们使用了!contains(b, element)。现在在 Swift 2.x 中,我们使用 !b.contains(element)
    【解决方案2】:

    请注意,如果使用 Set 选项,您的结果只是唯一值,并且不会保持初始顺序(如果这对您很重要),而 Array 过滤器选项将保持初始数组的顺序,至少保留哪些元素。

    斯威夫特 3

    let c = Set<Int>([65, 1, 2, 3, 1, 3, 4, 3, 2, 55, 43])
    let d = Set<Int>([2, 3, 4])
    c.subtracting(d)
    
    c = {65, 2, 55, 4, 43, 3, 1}
    d = {2, 3, 4}
    result = {65, 55, 43, 1}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多