我想用array2
减去array1
示例:
var array1 = ["the", "people", "prefer", "to", "go", "to", "the","sun","beach"]
var array2 = ["the", "people", "prefer", "go", "to", "the", "moon","beach"]
我想要输出:
["to","sun"]
我目前正在尝试的:
let reuslt = array1.filter { ! array2.contains($0) }
输出:
["sun"]
它正在检查是否包含匹配项,如果匹配,则删除所有项,但我想一对一地删除。
6条答案
按热度按时间a1o7rhls1#
就像在大脑中那样在计算机上执行,循环
array2
(而不是array1
),对于array2
的每个元素,如果该元素在array1
中有firstIndex
,则从array1
中删除该索引处的元素。fykwrbwg2#
实际上你要做的就是这个for循环
过滤器的工作方式与此完全相同,只是它不会在第一个项目上中断,而是继续删除所有项目。
你也可以把它放到一个像这样的一行程序中,用map代替filter:
array2.map({guard let i = array1.firstIndex(of: $0) else {return}; array1.remove(at: i)})
0ve6wy6x3#
和上面的答案一样,循环包含findIndex和remove from array也是可以的。
但在其他情况下,我认为如果数组太大,firstIndex(of:)和remove(at:)的复杂性会导致时间和CPU太多-设备的热量也会增加很多。您可以使用字典来最小化它。
这是另一种方法:
用法:
您可以在下面找到firstIndex,remove(at:)的复杂性:https://developer.apple.com/documentation/swift/array/firstindex(of:)https://developer.apple.com/documentation/swift/array/remove(at:)-1p2pj
jum4pzuy4#
@Thang Phi的答案是正确的,这并没有什么不同,但它在抽象的层面上工作,结合了Swift尚未提供内置类型的"计数集"思想:
zxlwwiss5#
你的例子在输出上看起来有点混乱/不完整。但是听起来你可以做这样的事情:
当然,使用扩展可以使这些代码对项目中的所有数组都可用。由于我们将数组转换为集合,因此重复的代码会被删除,这在您的用例中可能是一个问题。
此阵列扩展取自:https://www.hackingwithswift.com/example-code/language/how-to-find-the-difference-between-two-arrays所有事物的重要资源,尤其是SwiftUI。
aor9mmx16#
适用于
Equatable
类型(包括String
)的简单减法。