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

标签: ios Swift
发布时间: 2017/3/6 23:08:26
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图采取在一个二维数组的转置 swift 。但我不知道为什么不发生交换。

该数组转置后保持不变。我正在用下面的代码︰

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:

你嵌套的循环运行在所有可能的数组索引 (i, j) ,这意味着,每个数组元素已换用换位的元素两次

例如,当 i=1j=2(1, 2)(2, 1) 数组元素交换。 后来,当 i=2j=1 ,这些元素换回来。

因此,矩阵是相同的原始矩阵中结束。

解决方案是只遍历 (i, j)i < j ,即交换仅位于对角线上方的元素与对应的对角线的上下方︰

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
    }
}

请注意, Swift 标准库已经有一个函数来交换两个值︰

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

只是为了完整性︰ 一种替代解决方案将计算转置的矩阵作为值,并指定它到同一个 (或不同) 变量︰

array_4x4 = (0..<4).map { i in (0..<4).map { j in array_4x4[j][i] } }
官方微信
官方QQ群
31647020