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

4

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

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

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.
2个回答

10
您可以使用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标准库参考文档

或者你也可以使用Set类型。

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

谢谢Chris,太棒了! - pronebird
1
Chris,有没有可变的过滤器?它可以从数组中删除itms而不是返回新数组? - pronebird
1
我不这么认为。你对于将返回值分配给你的引用有什么顾虑? - Chris Wagner
嗯,避免重新分配内存并重复使用现有内存更便宜,但似乎在Swift数组中并非如此。 - pronebird
啊,是的,我在这个主题上找不到任何东西。我很好奇实现会是什么样子,因为你正在对你正在枚举的内容进行变异。然而,NSMutableArray有一个过滤方法可以做到这一点。 - Chris Wagner
3
在之前的Swift 1.x版本中,我们使用了!contains(b, element)。现在在Swift 2.x中,我们使用!b.contains(element) - Luke Schoen

0

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

Swift 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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接