我试图在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
}
}
答案 0 :(得分:2)
您的嵌套循环遍历所有可能的数组索引(i, j)
,这意味着
每个数组元素与转置元素交换两次。
例如,当i=1
和j=2
时,(1, 2)
和(2, 1)
数组元素将被交换。
稍后,当i=2
和j=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])
}
}