2010-03-22 10 views
7

Quelle est la méthode recommandée pour créer un tableau bidimensionnel prérempli dans Scala? J'ai le code suivant:Créer et remplir un tableau bidimensionnel dans Scala

val map = for { 
    x <- (1 to size).toList 
} yield for { 
     y <- (1 to size).toList 
    } yield (x, y) 

Comment faire un tableau au lieu de la liste? Remplacer .toList avec .toArray ne compile pas. Et y a-t-il une manière plus concise ou plus lisible de faire cela que les expressions imbriquées?

Répondre

9

Sur Scala 2.7, utilisez Array.range:

for { 
    x <- Array.range(1, 3) 
} yield for { 
    y <- Array.range(1, 3) 
} yield (x, y) 

Sur Scala 2.8, utilisez Array.tabulate:

Array.tabulate(3,3)((x, y) => (x, y)) 
+0

Array.tabulate semble doux, et ressemble à Array.fromFunction suggéré par Rex Kerr dans une autre réponse. Quelle est la différence (à part le fait que je vois Array.fromFunction est obsolète en 2.8)? Et comment fonctionnent-ils réellement? – asteinlein

+0

@asteinlein Je ne suis pas sûr de 'fromFunction' - je ne l'avais jamais remarqué auparavant - mais' tabulate' (qui est présent sur 'List' sur Scala 2.7) fonctionne à peu près comme le for-comprehension que vous avez écrit, mais '0 until size' au lieu de' 1 to size'. Sur Scala 2.7, cependant, il est unidimensionnel seulement, donc vous auriez besoin de les imbriquer. Sur Scala 2.8, vous pouvez fournir plusieurs dimensions (jusqu'à 5, je pense). –

+0

Merci. Pour tout le monde intéressé, cela fonctionne bien sur 2.7: List.tabulate (3, x => Liste.tabulate (3, y => (x, y)) .Array) .toArray – asteinlein

2

Parmi d'autres façons, vous pouvez utiliser l'utilisation Array.range et map:

scala> Array.range(0,3).map(i => Array.range(0,3).map(j => (i,j))) 
res0: Array[Array[(Int, Int)]] = Array(Array((0,0), (0,1), (0,2)), Array((1,0), (1,1), (1,2)), Array((2,0), (2,1), (2,2))) 

Ou vous pouvez utiliser Array.fromFunction:

scala> Array.fromFunction((i,j) => (i,j))(3,3)      
res1: Array[Array[(Int, Int)]] = Array(Array((0,0), (0,1), (0,2)), Array((1,0), (1,1), (1,2)), Array((2,0), (2,1), (2,2))) 

Scala 2.8 vous offre encore plus d'options - regarder à travers l'objet Array . (En fait, c'est un bon conseil pour 2.7, aussi ....)

Questions connexes