如何在swift3中有效地将一维数组转换为二维数组
How efficiently to convert one dimensional array to two dimensional array in swift3
将像素值数组 [UInt8]
转换为二维像素值行数组的有效方法是什么 - [[UInt8]]
你可以这样写:
var pixels: [UInt8] = [0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15]
let bytesPerRow = 4
assert(pixels.count % bytesPerRow == 0)
let pixels2d: [[UInt8]] = stride(from: 0, to: pixels.count, by: bytesPerRow).map {
Array(pixels[[=10=]..<[=10=]+bytesPerRow])
}
但是根据 Swift 数组的值语义,所有创建新嵌套数组的尝试都需要复制内容,因此可能 "efficient" 不足以满足您的目的。
重新考虑是否真的需要这样的嵌套数组。
这应该有效
private func convert1Dto2DArray(oneDArray:[String], stringsPerRow:Int)->[[String]]?{
var target = oneDArray
var outOfIndexArray:[String] = [String]()
let reminder = oneDArray.count % stringsPerRow
if reminder > 0 && reminder <= stringsPerRow{
let suffix = oneDArray.suffix(reminder)
let list = oneDArray.prefix(oneDArray.count - reminder)
target = Array(list)
outOfIndexArray = Array(suffix)
}
var array2D: [[String]] = stride(from: 0, to: target.count, by: stringsPerRow).map {
Array(target[[=10=]..<[=10=]+stringsPerRow])}
if !outOfIndexArray.isEmpty{
array2D.append(outOfIndexArray)
}
return array2D
}
将像素值数组 [UInt8]
转换为二维像素值行数组的有效方法是什么 - [[UInt8]]
你可以这样写:
var pixels: [UInt8] = [0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15]
let bytesPerRow = 4
assert(pixels.count % bytesPerRow == 0)
let pixels2d: [[UInt8]] = stride(from: 0, to: pixels.count, by: bytesPerRow).map {
Array(pixels[[=10=]..<[=10=]+bytesPerRow])
}
但是根据 Swift 数组的值语义,所有创建新嵌套数组的尝试都需要复制内容,因此可能 "efficient" 不足以满足您的目的。
重新考虑是否真的需要这样的嵌套数组。
这应该有效
private func convert1Dto2DArray(oneDArray:[String], stringsPerRow:Int)->[[String]]?{
var target = oneDArray
var outOfIndexArray:[String] = [String]()
let reminder = oneDArray.count % stringsPerRow
if reminder > 0 && reminder <= stringsPerRow{
let suffix = oneDArray.suffix(reminder)
let list = oneDArray.prefix(oneDArray.count - reminder)
target = Array(list)
outOfIndexArray = Array(suffix)
}
var array2D: [[String]] = stride(from: 0, to: target.count, by: stringsPerRow).map {
Array(target[[=10=]..<[=10=]+stringsPerRow])}
if !outOfIndexArray.isEmpty{
array2D.append(outOfIndexArray)
}
return array2D
}