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

has*_*emi 8 functional-programming swift

我有这个代码:

let items = [1, 2, 3]
let sep = 0
Run Code Online (Sandbox Code Playgroud)

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

newItems = [1, 0, 2, 0, 3]
Run Code Online (Sandbox Code Playgroud)

有没有一种简洁的方法来通过Swift中的函数式编程来实现这一点?类似的东西String.join(),但对于数组.

Mar*_*n R 11

这样做的诀窍:

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

let newItems = [sep].join(items.map { [ $0 ] } )

println(newItems) // [1, 0, 2, 0, 3]
Run Code Online (Sandbox Code Playgroud)

items.map { [ $0 ] }创建一个单元素数组数组,[sep].join(...)然后插入分隔符并连接元素.

另一种可能的方案

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

它将偶数索引映射到相应的元素items,并将奇数索引映射到分隔符.

假设第二个解决方案表现更好,因为它不会创建这么多中间数组,但我将测试留给你:)

  • 请记住,如果使用引用类型作为分隔符,更改它将更改插入到数组中的所有实例! (4认同)

obe*_*ber 10

转换为 swift 5

extension Array {

  func insert(separator: Element) -> [Element] {
    (0 ..< 2 * count - 1).map { $0 % 2 == 0 ? self[$0/2] : separator }
  }
}
Run Code Online (Sandbox Code Playgroud)


Bra*_*ega 7

这是转换为 Swift 3/4 的原始答案

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

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

print(newItems) // [1, 0, 2, 0, 3]
Run Code Online (Sandbox Code Playgroud)