can*_*boy 0 arrays functional-programming swift
如果我有一个一维数组:
oneDimArray = [1,2,3,4,5,6,7,8,9]
我已经有一个 3X3 的二维数组,其中有适当数量的插槽来适合数字
twoDimArray = [[0,0,0], [0,0,0], [0,0,0]]
...如何将 oneDimArray 数字放入 twoDimArray,例如:
[[1,2,3], [4,5,6], [7,8,9]]
?
我知道我可以用几个嵌套的 for 循环来做到这一点,但是有没有更简单、更实用的方法来做到这一点?
这是一种方法。做一个迭代出你的一个维数组,然后用map并compactMap沿.next()取代的价值twoDimArray创造newArray:
let oneDimArray = [1,2,3,4,5,6,7,8,9]
let twoDimArray = [[0,0,0], [0,0,0], [0,0,0]]
var iter = oneDimArray.makeIterator()
let newArray = twoDimArray.map { $0.compactMap { _ in iter.next() } }
print(newArray)
Run Code Online (Sandbox Code Playgroud)
输出
Run Code Online (Sandbox Code Playgroud)[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
这种技术的一个很好的特点是你可以轻松地填充任何数组模式,而不仅仅是创建一个固定的 3x3 数组,例如:
let oneDimArray = [1,2,3,4,5,6,7,8,9,10]
let patternArray = [[0], [0,0], [0,0,0], [0,0,0,0]]
var iter = oneDimArray.makeIterator()
let newArray = patternArray.map { $0.compactMap { _ in iter.next() } }
print(newArray)
Run Code Online (Sandbox Code Playgroud)
输出
Run Code Online (Sandbox Code Playgroud)[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]
通用函数
我们可以把它变成一个通用函数,可以用一维数组的值替换二维数组的值。请注意,如果您愿意,数组中值的类型可以不同:
func overlay<T, U>(_ array: [[T]], values: [U]) -> [[U]] {
var iter = values.makeIterator()
return array.map { $0.compactMap { _ in iter.next() }}
}
// Create an 2D array of strings from this pattern
let patternArray = [[0], [0,0], [0,0,0], [0,0,0,0]]
print(overlay(patternArray, values: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]))
Run Code Online (Sandbox Code Playgroud)
输出
Run Code Online (Sandbox Code Playgroud)[["a"], ["b", "c"], ["d", "e", "f"], ["g", "h", "i", "j"]]
| 归档时间: |
|
| 查看次数: |
956 次 |
| 最近记录: |