Swift:像在 Lua 中一样快速从数组中删除元素
Posted
技术标签:
【中文标题】Swift:像在 Lua 中一样快速从数组中删除元素【英文标题】:Swift: Remove element from array quickly like in Lua 【发布时间】:2017-11-22 11:53:02 【问题描述】:我有一个包含很多元素的数组。我想按值而不是按键删除元素。看来你必须这样做:
array = array.filter() $0 !== value
对于来自 Lua 背景的我来说,这似乎有点等同于这个 Lua 代码:
for k,v in pairs(array) do
if v == value then table.remove(array, k) end
end
这是一个比较慢的方法,Lua中比较快的方法是设置key为value:
array = [value] = "something"
array[value] = nil
在 Swift 中有什么等价的吗?在我看来,过滤器会检查每个元素,所以我觉得必须有更快的方法。如果你用字典,会更好吗?
【问题讨论】:
相关:Array extension to remove object by value. 要找到最适合使用的数据结构,我们需要更多信息。数组元素的顺序重要吗?有没有重复的元素?数组中大概有多少个元素?你的数组元素是hashable(即它们可以用作 Swift 字典的键)吗?还有,数组是如何创建的?您是自己构建它,还是只是从其他地方完全形成它? 它包含一个 SKScene 中的所有节点。顺序无关紧要,元素计数会随着从数组中删除和过滤节点而变化。 【参考方案1】:我认为filter
是适合您的方式。您也可以通过index
删除元素,但我仍然会使用filter
方法:
过滤器:
array = array.filter() $0 !== value
按索引删除:
if let index = array.index(where: $0 == value )
array.remove(at: index)
【讨论】:
这是一种快速的方法吗?有没有办法让它更快? @MysteryPancake,它已经够快了。我在较大的阵列上使用filter
,我对 prestanda 和 index
示例没有任何问题。
过滤器是否足够快取决于数组中有多少项目,以及需要多快。从逻辑上讲,过滤数组需要 O(n) 时间,因为您需要遍历所有值并测试每个值。但是,我不确定它在 Swift 中是如何工作的具体细节。内存管理可能会使其更昂贵。在大多数情况下,使用字典将花费 O(1) 时间,尽管在 Swift 中从字典中删除元素的最坏情况显然是 O(n(log n))。以上是关于Swift:像在 Lua 中一样快速从数组中删除元素的主要内容,如果未能解决你的问题,请参考以下文章
Swift flatMap:如何从数组中仅删除元组中特定元素为零的元组?
我们可以像在 android asyncTask 中一样显示加载状态,直到我们在 swift 中使用 HTTP Post 请求得到响应
Swift - 如何像在 App Store 中一样共享应用链接