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 中一样共享应用链接

在 Swift 中像在 Java 中一样使用套接字

Swift3 如何像在 android 中一样在 iOS 中实现底部工作表

(Swift)如何从元组数组[(Date, MyClass)]中获取元组元素(Date, MyClass)的索引?