我有一个(可能非常大的(users
数组。如果用户包含在这个数组中,我想从这个数组中删除一个特定的用户
if users.contains(user) {
users = users.filter { $0.id != user.id }
count -= 1
change -= 1
}
从时间和空间复杂性的角度考虑,contains()
是O(n(运算,而filter()
也是O(n(运算。
我可以这样做:
for (index, user) in users.enumerated() {
if user == userToRemove {
users.remove(at: index)
count -= 1
change -= 1
}
}
但这里remove(at:)
是一个O(n(运算,for循环也是如此。因此,在这两种情况下,我都必须在整个数组中循环两次。
我可以做的另一件事是事先将其转换为Set
,但这会丢失排序。
有没有办法提高它的效率,使它最多只需要循环一次?
假设您想要唯一的用户,您可以只使用Set
,其contains
是O(1(。
如果您需要订购用户,可以使用Swift Collections包中的OrderedSet
。