2016-08-09 12 views
1

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

答えて

2

あなたのネストされたループが 各配列要素は、転置要素二回と交換されることを意味し、すべての可能な配列のインデックス(i, j)、上で実行されます:私は、次のコードで働いています。

たとえば、i=1およびj=2の場合、(1, 2)(2, 1)の配列要素が入れ替えられます。 その後、i=2j=1の場合、これらの要素はスワップバックされます。

結果として、行列は最後の元の行列と同じです。スウィフト標準ライブラリがすでに持っていることを

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

注:

ソリューション斜め下に彼らの 相手とi < j、 すなわちスワップと対角線上の要素だけを唯一のオーバー(i, j)ペアを反復することです への関数は、2つの値を交換します。

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

ST完全性のために: 代替ソリューションを としての価値を転置行列を計算し、同じ(または異なる)変数に代入するために、次のようになります。

array_4x4 = (0..<4).map { i in (0..<4).map { j in array_4x4[j][i] } } 
+0

どうもありがとうございました。それは助けになった。 –

関連する問題