我想把这个:
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
进入这个:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
非常优雅。
最直接的方法当然是
var y = [Int]()
x.forEach { y.appendContentsOf($0) }
但这会使生成的数组可变,这是不必要的。我不喜欢这种方式。
我尝试使用reduce
:
let y = x.reduce([Int]()) { (array, ints) -> [Int] in
array.appendContentsOf(ints)
return array
}
但是编译器提示说 array
是不可变的,所以我不能调用变异方法 appendContentsOf
。
因此,我添加了一些东西:
let y = x.reduce([Int]()) { (array, ints) -> [Int] in
var newArr = array
newArr.appendContentsOf(ints)
return newArr
}
这只是很糟糕。我有一种直觉,这并不 swift 。
我怎样才能比上述方法更快地展平数组?单线会很好。
最佳答案
有一个名为 joined
的内置函数:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]].joined()
(请注意,这实际上并不返回另一个数组,它返回一个 FlattenSequence
,但这通常无关紧要,因为它仍然是一个序列,您可以使用 for
循环等等。如果你真的很在意,你可以使用 Array(arrayOfArrays.joined())
。)
flatMap
function也可以帮你解决。它的签名大致是,
flatMap<S: SequenceType>(fn: (Generator.Element) -> S) -> [S.Generator.Element]
这意味着您可以传递一个 fn
,它为任何元素返回一个序列,它会组合/连接这些序列。
因为你的数组元素本身就是序列,你可以使用一个只返回元素本身的函数({ x in return x }
或等价的 {$0}
) :
[[1, 2, 3], [4, 5, 6], [7, 8, 9]].flatMap{ $0 }
关于arrays - 如何在 Swift 中快速展平数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37221182/