您还可以使用filter
and contains
结合起来:
let fruitsArray = ["apple", "mango", "blueberry", "orange"]
let vegArray = ["tomato", "potato", "mango", "blueberry"]
// only Swift 1
let output = fruitsArray.filter{ contains(vegArray, $0) }
// in Swift 2 and above
let output = fruitsArray.filter{ vegArray.contains($0) }
// or
let output = fruitsArray.filter(vegArray.contains)
Set
vs Array
用于公共元素的单次计算
我们考虑以下代码片段:
let array1: Array = ...
let array2: Array = ...
// `Array`
let commonElements = array1.filter(array2.contains)
// vs `Set`
let commonElements = Array(Set(array1).intersection(Set(array2)))
// or (performance wise equivalent)
let commonElements: Array = Set(array1).filter(Set(array2).contains)
我做了一些(人工)基准测试Int
和短/长String
秒(10 至 100Character
s)(全部随机生成)。我总是用array1.count == array2.count
我得到以下结果:
如果您有超过critical #(number of) elements
转换为Set
更可取
data | critical #elements
-------------|--------------------
Int | ~50
short String | ~100
long String | ~200
结果解释
使用Array
方法使用“蛮力”搜索,其中有时间复杂度 O(N^2)
where N = array1.count = array2.count
这与Set
方法O(N)
。然而,转换自Array
to Set
对于大数据来说,返回非常昂贵,这解释了critical #elements
对于更大的数据类型。
结论
对于小Array
s 大约有 100 个元素Array
方法很好,但对于较大的方法,您应该使用Set
方法。
如果你想多次使用这个“通用元素”操作,建议使用Set
s only如果可能的话(元素的类型必须是Hashable
).
最后的评论
转换自Array
to Set
有点昂贵,而从Set
to Array
相比之下非常便宜。
Using filter
with .filter(array1.contains)
性能方面比.filter{ array1.contains($0) }
since:
- 最后一个创建了一个新的闭包(只有一次) 而第一个仅传递函数指针
- 对于最后一个,闭包的调用会创建一个额外的堆栈帧,这会消耗空间和时间(多次:
O(N)
)