如何在数组的每两个元素之间重复插入一个项目?
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
+ joined
和 CollectionOfOne
):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]
我有这个代码:
let items = [1, 2, 3]
let sep = 0
我想在 items
的每两个元素之间插入 sep
以获得类似于这样的结果:
newItems = [1, 0, 2, 0, 3]
在Swift中有通过函数式编程的简洁方法吗?类似于 String.join()
,但用于数组。
(注意: Swift 3 及更高版本的答案已在
这就是诀窍:
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
+joined
和CollectionOfOne
):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]