gpt4 book ai didi

swift - 如何在数组的每两个元素之间重复插入一个项目?

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:43 47 4
gpt4 key购买 nike

我有这个代码:

let items = [1, 2, 3]
let sep = 0

我想在 items 的每两个元素之间插入 sep 以获得类似于这样的结果:

newItems = [1, 0, 2, 0, 3]

有没有一种简洁的方法可以通过 Swift 中的函数式编程来做到这一点?类似于 String.join(),但用于数组。

最佳答案

(注意:答案已在 Brandon's answerober's answer 的帮助下针对 Swift 3 及更高版本进行了更新。

这就是诀窍:

let items = [1, 2, 3]
let sep = 0

let newItems = Array(items.map { [$0] }.joined(separator: [sep]))
print(newItems) // [1, 0, 2, 0, 3]

items.map { [ $0 ] } 创建单元素数组的数组,然后 joined(separator: [sep]) 插入分隔符并连接要素。结果是一个 JoinedSequence,我们可以从中创建一个 Array

事实证明(下面的基准)创建许多临时数组非常昂贵。这可以通过使用“单元素集合”来避免:

let newItems = Array(items.map(CollectionOfOne.init).joined(separator: CollectionOfOne(sep)))

另一种可能的解决方案是

let newItems = (0 ..< 2 * items.count - 1).map { $0 % 2 == 0 ? items[$0/2] : sep }

它甚至将索引映射到 items 的相应元素,和分隔符的奇数索引。事实证明,这是大型阵列最快的解决方案。

基准 items 包含 1,000,000 个元素,在 2.3 GHz Intel Core i7 MacBook Pro 上以 Release 模式编译,我测量了以下近似执行时间:

  • 第一种方法(map + joined 数组):0.28 秒。

  • 第二种方法(map + joined with CollectionOfOne):0.035 秒。

  • 第三种方法(仅使用 map):0.015 秒。

关于swift - 如何在数组的每两个元素之间重复插入一个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29346992/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com