提供两个数组去重的扩展,第一个是大家网上直接搜索最常见的:
extension Array {
func uniqued<E: Equatable>(_ filter: (Element) -> E) -> [Element] {
var result = [Element]()
for ele in self {
let key = filter(ele)
if !result.map({ filter($0) }).contains(key) {
result.append(ele)
}
}
return result
}
}
没有什么大问题,但是数据稍微多一点耗时就增加,如果直接在主线程的话还会造成卡顿,时间复杂度O(n^2),不太建议使用
优化时间复杂度,常见的就是使用 Map 了:
extension Array {
func uniqued<H: Hashable>(_ filter: (Element) -> H) -> [Element] {
var result = [Element]()
var map = [H: Element]()
for ele in self {
let key = filter(ele)
if map[key] == nil {
map[key] = ele
result.append(ele)
}
}
return result
}
}
时间复杂度 O(n) ,建议使用
当然还有一种比较搞笑的去重方式那就是使用 Set
, 但是实际项目中遇到简单的数据去重的情况比较少,一般数组内装的都是一个结构体或者一个类这样的数据模型的情况居多。