我在Swift中有一个嵌套数组,其中每个内部数组可能有不同的大小:
let numbers = [[0], [1], [2, 3], [4]]
问题是我需要根据单个索引值修改一个条目(主要基于展平数组的索引;所以在这个例子中,每个值本质上都是它的索引)。
我通过flatMap
调用问题解决了一半问题,但我不确定如何重新嵌套它,或者我是否采取了错误的方法。
func setValue(_ value: Int, index: Int, list: [[Int]]) -> [[Int]]
{
var output = numbers.flatMap { $0 }
output[index] = value
// TODO: Re-nest
return [output]
}
let output = setValue(42, index: 3, list: numbers)
print(output) // [[0, 1, 2, 42, 4]]
如何制作此输出[[0], [1], [2, 42], [4]]
,是否有更优雅(实用)的方法来实现此目标?
答案 0 :(得分:1)
继续遍历子数组,直到达到指定的index
,然后在该子数组中计算其偏移量:
func setValue(_ value: Int, index: Int, list: [[Int]]) -> [[Int]]
{
var output = list
var cumulativeCount = 0
for i in 0..<output.count {
if cumulativeCount + output[i].count > index {
output[i][index - cumulativeCount] = value
break
} else {
cumulativeCount += output[i].count
}
}
return output
}
print(setValue(42, index: 3, list: [[0], [1], [2, 3], [4]]))
print(setValue(42, index: 3, list: [[2, 12, 14], [5], [6]]))
但是,这并不会检查index
是否属于list
。如果您在此示例中设置index = 100
,则该函数不会更改任何内容。
答案 1 :(得分:1)
我有一个(某种程度上)使用两个地图的功能解决方案。
func setValue(_ value: Int, index: Int, list: [[Int]]) -> [[Int]] {
var i = -1
return list.map { arr in
return arr.map { e in
i += 1
if (i == index) { return value }
else { return e }
}
}
}
我还没有多少时间考虑一个聪明的方法来解决这个问题,但这是我的hacky。
答案 2 :(得分:0)
试试这个,让我知道它是否适合你。
var numbers = [[0], [1], [2, 3], [4]]
func setValue(_ value: Int, index: Int, list: inout [[Int]]) {
var listS: [Int] = list[index]
listS.append(value)
list[index] = listS
}
setValue(42, index: 2, list: &numbers)
print(numbers) // [[0], [1], [2, 3, 42], [4]]