2016-08-09 35 views
1

Ich versuche, transpose eines 2d-Array in Swift. Aber ich weiß nicht, warum das Tauschen nicht stattfindet.Einfacher Austausch Code funktioniert nicht in Swift

Das Array bleibt nach dem Transponieren gleich. Ich arbeite mit dem folgenden Code:

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

Antwort

2

Ihre verschachtelte Schleife läuft über alle möglichen Array-Indizes (i, j), was bedeutet, dass jedes Array-Element mit dem transponierten Element ausgetauscht wird zweimal.

Zum Beispiel, wenn i=1 und j=2, die (1, 2) und die (2, 1) Array-Elemente sind vertauscht. Später, wenn i=2 und j=1, werden diese Elemente zurück getauscht.

Als Konsequenz ist die Matrix am Ende identisch mit der ursprünglichen Matrix.

Die Lösung ist mit i < j, dh Swap nur die Elemente oberhalb der Diagonale mit ihren Gegenstück unter der Diagonalen nur über (i, j) Paare iterieren:

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

beachte, dass die Swift-Standardbibliothek bereits eine Funktion zum Austausch zwei Werte:

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

Und ju st aus Gründen der Vollständigkeit: Eine alternative Lösung wäre es, die transponierte Matrix als einen Wert zu berechnen, und um es zu der gleichen zuweisen (oder einer anderen) Variable:

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

Vielen Dank. Es half. –