Arrays 如何在Swift中快速展平阵列?
我想把这个转变为:Arrays 如何在Swift中快速展平阵列?,arrays,swift,flatten,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]
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
是不可变的,所以我不能调用mutating方法appendContentsOf
因此,我添加了一些内容:
let y = x.reduce([Int]()) { (array, ints) -> [Int] in
var newArr = array
newArr.appendContentsOf(ints)
return newArr
}
这太糟糕了。我有一种直觉,这不是很快
如何比上述方法更快速地展平阵列?一行程序就好了。有一个内置的函数,叫做: (请注意,这实际上并不返回另一个数组,而是返回一个
flattSequence
,但这通常并不重要,因为它仍然是一个序列,可以与一起用于循环等等。如果您真的在意,可以使用数组(arrayOfArrays.joined())
)
这也可以帮助你。它的签名大概是,
flatMap<S: SequenceType>(fn: (Generator.Element) -> S) -> [S.Generator.Element]
数组中的展平函数:
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = Array(x.flatten())
print(y)
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = x.flatMap({$0})
print(y)
数组中的flatMap函数:
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = Array(x.flatten())
print(y)
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = x.flatMap({$0})
print(y)
您的输出:
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = Array(x.flatten())
print(y)
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let y = x.flatMap({$0})
print(y)
更多信息:使用Swift 5,您可以选择以下三种方法之一来展平阵列
#1.使用array
的flatMap(:)
方法展平数组
使用Swift,符合序列
协议的类型(包括数组
)具有平面映射(:)
方法<代码>数组具有以下声明:
func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
func joined() -> FlattenSequence<Array<Element>>
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
#2.使用array
的joined()
方法展平数组
Array
的方法名为joined()
。有以下声明:
func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
func joined() -> FlattenSequence<Array<Element>>
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
#3.使用array
的reduce(::)
方法展平数组
SwiftArray
具有具有以下声明的方法:
func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
func joined() -> FlattenSequence<Array<Element>>
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
作为reduce(::)
的替代方法,您可以使用:
您只需要使用2函数就可以做到这一点
加入()
压缩图
设y=x.compactMap{$0}.joined().compactMap{$0}
哦,我明白了!我以前看过flatMap
。但是我看错了-flatMap(transform:([Int])->T?throws->[T]
。我想知道“这和地图有什么不同?”现在我明白了。非常感谢。对平面图有多种类型。去读一读关于单子的书,你可能会明白为什么他们有相同的名字:-)很高兴知道!我认为我们必须在循环之前强制转换类型,很高兴看到我们没有:)Swift中的数组结构上没有展平方法,而是连接方法。可能是