web-dev-qa-db-fra.com

Tableaux multidimensionnels dans Swift

Edit: Comme le fait remarquer Adam Washington, à partir de la version 6, ce code fonctionne tel quel, de sorte que la question n’est plus pertinente.

J'essaie de créer et de parcourir un tableau à deux dimensions:

var array = Array(count:NumColumns, repeatedValue:Array(count:NumRows, repeatedValue:Double()))

array[0][0] = 1
array[1][0] = 2
array[2][0] = 3
array[0][1] = 4
array[1][1] = 5
array[2][1] = 6
array[0][2] = 7
array[1][2] = 8
array[2][2] = 9

for column in 0...2 {
    for row in 0...2 {
        println("column: \(column) row: \(row) value:\(array[column][row])")
    }
}

Cependant, voici le résultat obtenu:

column: 0 row: 0 value:3.0
column: 0 row: 1 value:6.0
column: 0 row: 2 value:9.0
column: 1 row: 0 value:3.0
column: 1 row: 1 value:6.0
column: 1 row: 2 value:9.0
column: 2 row: 0 value:3.0
column: 2 row: 1 value:6.0
column: 2 row: 2 value:9.0

Il semble que la dernière colonne de la ligne remplace les autres valeurs de colonne.

Est-ce que je le déclare mal?

Edit: Peut-être une image du terrain de jeu pourrait aider:

Captured from Playground

48
Caroline

Pour les futurs lecteurs, voici une solution élégante (5x5):

var matrix = [[Int]](repeating: [Int](repeating: 0, count: 5), count: 5)

et une approche dynamique:

var matrix = [[Int]]() // creates an empty matrix
var row = [Int]() // fill this row
matrix.append(row) // add this row
9
ignaciohugog

Comme indiqué dans les autres réponses, vous ajoutez le même tableau de lignes à chaque colonne. Pour créer un tableau multidimensionnel, vous devez utiliser une boucle

var NumColumns = 27
var NumRows = 52
var array = Array<Array<Double>>()
for column in 0..NumColumns {
    array.append(Array(count:NumRows, repeatedValue:Double()))
}
53
Rod
var array: Int[][] = [[1,2,3],[4,5,6],[7,8,9]]

for first in array {
    for second in first {
        println("value \(second)")
    }
}

Pour obtenir ce que vous cherchez, vous devez initialiser le tableau avec le bon modèle, puis effectuer une boucle pour ajouter les tableaux de lignes et de colonnes:

var NumColumns = 27
var NumRows = 52
var array = Array<Array<Int>>()
var value = 1

for column in 0..NumColumns {
    var columnArray = Array<Int>()
    for row in 0..NumRows {
        columnArray.append(value++)
    }
    array.append(columnArray)
}

println("array \(array)")
14
bbarnhart

Votre problème est peut-être dû à une déficience d'une version antérieure de Swift ou de la version bêta de Xcode. Lorsque vous utilisez Xcode version 6.0 (6A279r) le 21 août 2014, votre code fonctionne comme prévu avec cette sortie:

 colonne: 0 rangée: 0 valeur: 1.0 
 colonne: 0 rangée: 1 valeur: 4.0 
 colonne: 0 rangée: 2 valeur: 7,0 
 colonne: 1 rangée: 0 valeur: 2,0 
 colonne: 1 rangée: 1 valeur: 5,0 
 colonne: 1 rangée: 2 valeur: 8,0 
 colonne: 2 rangée: 0 valeur: 3,0 
 colonne: 2 rangées: 1 valeur: 6,0 
 colonne: 2 rangées: 2 valeur: 9,0 

Je viens de copier et coller votre code dans un terrain de jeu Swift) et définir deux constantes:

laisser NumColumns = 3, NumRows = 3
5
Adam Washington

En utilisant http://blog.trolieb.com/trouble-multidimensional-arrays-Swift/ , j'ai ajouté les génériques au mien:

class Array2DTyped<T>{

var cols:Int, rows:Int
var matrix:[T]

init(cols:Int, rows:Int, defaultValue:T){
    self.cols = cols
    self.rows = rows
    matrix = Array(count:cols*rows,repeatedValue:defaultValue)
}

subscript(col:Int, row:Int) -> T {
    get{
        return matrix[cols * row + col]
    }
    set{
        matrix[cols * row + col] = newValue
    }
}

func colCount() -> Int {
    return self.cols
}

func rowCount() -> Int {
    return self.rows
}
}
4
user2982104

Vous créez un tableau de trois éléments et assignez les trois à la même chose, qui est elle-même un tableau de trois éléments (trois doubles).

Lorsque vous effectuez les modifications, vous modifiez les flottants dans le tableau interne.

1
Analog File

Votre logique d’origine pour la création de la matrice est en effet correcte et fonctionne même dans Swift 2. Le problème est que, dans la boucle d’impression, vous avez les variables de ligne et de colonne inversées. Si vous le modifiez à:

for row in 0...2 {
  for column in 0...2 {
    print("column: \(column) row: \(row) value:\(array[column][row])")

  }
}

vous obtiendrez les bons résultats. J'espère que cela t'aides!

1
Michael Sheaver