Swe*_*per 14 arrays flatten swift
我想转此:
let x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)
进入这个:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
非常优雅.
当然,最直接的方式是
var y = [Int]()
x.forEach { y.appendContentsOf($0) }
Run Code Online (Sandbox Code Playgroud)
但这使得生成的数组变得可变,这是不必要的.我不喜欢这样.
我试过用reduce:
let y = x.reduce([Int]()) { (array, ints) -> [Int] in
array.appendContentsOf(ints)
return array
}
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨这array是不可变的,所以我不能调用变异方法appendContentsOf.
因此,我添加了一些东西:
let y = x.reduce([Int]()) { (array, ints) -> [Int] in
var newArr = array
newArr.appendContentsOf(ints)
return newArr
}
Run Code Online (Sandbox Code Playgroud)
这简直太糟糕了.我有一种本能,这不是很好的.
如何比上述方法更加平滑地展平阵列?单线会很好.
jtb*_*des 25
这里有一个内置函数joined:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]].joined()
Run Code Online (Sandbox Code Playgroud)
(注意,这实际上不会返回另一个数组,它返回一个FlattenBidirectionalCollection,但这通常无关紧要,因为它仍然是一个可以用于for循环和诸如此类的序列.如果你真的在乎,你可以使用Array(arrayOfArrays.joined()).)
该flatMap功能还可以帮助您.它的签名大致是
flatMap<S: SequenceType>(fn: (Generator.Element) -> S) -> [S.Generator.Element]
Run Code Online (Sandbox Code Playgroud)
这意味着您可以传递fn任何元素返回序列,并且它将组合/连接这些序列.
由于数组的元素本身就是序列,因此您可以使用一个只返回元素本身的函数({ x in return x }或等效的{$0}):
[[1, 2, 3], [4, 5, 6], [7, 8, 9]].flatMap{ $0 }
Run Code Online (Sandbox Code Playgroud)
使用Swift 3,根据您的需求和品味,您可以选择以下三种方法之一来展平阵列.
Array的flatMap(_:)方法Swift为Sequence符合Array协议(包括flatMap(_:))的所有类型提供了一种方法.Array有以下声明:
func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
Run Code Online (Sandbox Code Playgroud)
返回一个数组,其中包含使用此序列的每个元素调用给定转换的连接结果.
以下Playground代码显示如何使用方法将类型展平flatMap(_:)为类型:Array[[Int]][Int]
let array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let flattenArray = array.flatMap({ (element: [Int]) -> [Int] in
return element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
flatMap(_:)的Array方法和joined()的Array初始值设定Swift还为joined()符合joined()协议(包括Array)的所有类型提供了一种方法.[[Int]]有以下声明:
func joined() -> FlattenSequence<Array<Element>>
Run Code Online (Sandbox Code Playgroud)
返回连接序列序列的元素.
此外,Swift [Int]还有一个joined()初始化程序.Array有以下声明:
let array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let flattenCollection = array.joined()
let flattenArray = Array(flattenCollection)
print(flattenArray) // prints [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
创建一个包含序列元素的数组.
因此,以下Playground代码显示如何使用method和initializer 将类型展平reduce(_:_:)为类型:Arrayreduce(_:_:)Array[[Int]]
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
Run Code Online (Sandbox Code Playgroud)
[Int]的reduce(_:_:)方法斯威夫特reduce(_:_:)有一种reduce(into:_:)方法.Array有以下声明:
let array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let flattenArray = array.reduce([], { (result: [Int], element: [Int]) -> [Int] in
return result + element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
返回使用此序列的每个元素和累积值调用给定组合闭包的结果.
以下Playground代码显示如何使用方法将类型展平flatMap(_:)为类型:SequenceArrayflatMap(_:)
let array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let flattenArray = array.reduce(into: [Int]()) { (result: inout [Int], element: [Int]) in
result += element
}
print(flattenArray) // prints [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5794 次 |
| 最近记录: |