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

How do I insert an item repeatedly between every two elements of an array?

我有这个代码:

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

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

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

在Swift中有通过函数式编程的简洁方法吗?类似于 String.join(),但用于数组。

(注意: Swift 3 及更高版本的答案已在 and 的帮助下更新。

这就是诀窍:

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

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

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

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

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

另一种可能的解决方案是

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

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

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

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

  • 第二种方法(map + joinedCollectionOfOne):0.035 秒。

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

转换为swift 5

extension Array {

  func insert(separator: Element) -> [Element] {
    (0 ..< 2 * count - 1).map { [=10=] % 2 == 0 ? self[[=10=]/2] : separator }
  }
}

这里是原答案转换成Swift3/4

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

let newItems = Array(items.map { [[=10=]] }.joined(separator: [sep]))

print(newItems) // [1, 0, 2, 0, 3]