arrays - 如何在 Swift 中快速展平数组?

标签 arrays swift flatten

我想把这个:

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/

相关文章:

ios - 如何通过闭包将数据从一个 ViewController 传输到另一个

google-sheets - 过滤 Google 表格中的非唯一数据集

javascript - 有没有办法在 JSON 响应中选择数组中的数组,而不使用标准数字索引(JS)

c - 关于存储持续时间的数组初始化(字符、字符串、其他)的差异

python - 从 np.array 中删除零行

java - 从 try/catch block 中返回变量

swift - 强制将单个参数传递给多可选参数函数

json - 编写一个函数来解码通用 JSON。如何为 Codable.Protocol 提供参数?

python - 在没有极端缩进的 python 中维护可回滚的代码流

Python Pandas : fast way to flatten JSON into rows by a surrogate key