简单的交换代码不能在swift中工作

时间:2016-08-09 05:54:16

标签: ios swift multidimensional-array

我试图在swift中转换2d数组。但我不知道为什么交换没有发生。

转换后阵列保持不变。我正在使用以下代码:

var array_4x4 = [[Int]](count: 4, repeatedValue: [Int](count: 4, repeatedValue: 4))

for i in 0..<4
{
    for j in 0..<4
    {
        let temp = Int(arc4random_uniform((100 + 1)) - 1) + 1
        array_4x4[i][j] = temp
    }
}

for i in 0..<4
{
    for j in 0..<4    // code in this loop is not working
    {
        let temp = array_4x4[i][j]

        array_4x4[i][j] = array_4x4[j][i]

        array_4x4[j][i] = temp
    }
}

1 个答案:

答案 0 :(得分:2)

您的嵌套循环遍历所有可能的数组索引(i, j),这意味着 每个数组元素与转置元素交换两次

例如,当i=1j=2时,(1, 2)(2, 1)数组元素将被交换。 稍后,当i=2j=1时,这些元素会被换回。

因此,矩阵最终与原始矩阵相同。

解决方案仅针对(i, j)的{​​{1}}对进行迭代, 即只交换对角线上方的元素 对角线以下对应物:

i < j

请注意,Swift标准库已具有以下功能 交换两个值:

for i in 0..<4 {
    for j in (i + 1)..<4 {
        let temp = array_4x4[i][j]
        array_4x4[i][j] = array_4x4[j][i]
        array_4x4[j][i] = temp
    }
}

只是为了完整起见: 另一种解决方案是将转置矩阵计算为 一个值,并将其分配给相同(或不同)的变量:

for i in 0..<4 {
    for j in (i + 1)..<4 {
        swap(&array_4x4[i][j], &array_4x4[j][i])
    }
}