快速将一维数组转换为二维数组

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 循环来做到这一点,但是有没有更简单、更实用的方法来做到这一点?

vac*_*ama 8

这是一种方法。做一个迭代出你的一个维数组,然后用mapcompactMap沿.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)

输出

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)

这种技术的一个很好的特点是你可以轻松地填充任何数组模式,而不仅仅是创建一个固定的 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)

输出

[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]
Run Code Online (Sandbox Code Playgroud)

通用函数

我们可以把它变成一个通用函数,可以用一维数组的值替换二维数组的值。请注意,如果您愿意,数组中值的类型可以不同:

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)

输出

[["a"], ["b", "c"], ["d", "e", "f"], ["g", "h", "i", "j"]]
Run Code Online (Sandbox Code Playgroud)