在Swift中修改嵌套数组条目

时间:2017-08-29 17:52:10

标签: arrays swift functional-programming

我在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]],是否有更优雅(实用)的方法来实现此目标?

3 个答案:

答案 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,则该函数不会更改任何内容。

Code Snippet on IBM Bluemix

答案 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]]