2010-08-19 7 views
7

Y at-il un moyen de construire des tableaux dynamiques multidimensionnels dans Scala? Je sais que les tableaux de Scala doivent être initialisés dans leurs tailles et dimensions, donc je ne le veux pas. La structure de données devrait être dynamique. J'ai essayé de le construire avec des listes dans des listes, mais je me suis perdu d'une manière ou d'une autre.scala dynamique tableaux multidimensionnels mutables comme des structures de données

Il y a tellement de types différents, peut-être que je n'ai pas trouvé le bon. Alors s'il vous plaît, poussez-moi dans la bonne direction.

Répondre

6

Si vous voulez faire quelque chose comme

un (5) = // résultat d'un calcul

Ensuite, vous devrez utiliser quelque chose de la hiérarchie des collections mutables. Je suggérerais ArrayBuffer.

scala> import scala.collection.mutable.ArrayBuffer 
import scala.collection.mutable.ArrayBuffer 

scala> val a = ArrayBuffer.fill(3,3)(0) 
a: scala.collection.mutable.ArrayBuffer[scala.collection.mutable.ArrayBuffer[Int]] = ArrayBuffer(ArrayBuffer(0, 0, 0), ArrayBuffer(0, 0, 0), ArrayBuffer(0, 0, 0)) 

scala> a(2)(1) = 4 

scala> a(0) = ArrayBuffer(1,2,3) 

scala> a 
res2: scala.collection.mutable.ArrayBuffer[scala.collection.mutable.ArrayBuffer[Int]] = ArrayBuffer(ArrayBuffer(1, 2, 3), ArrayBuffer(0, 0, 0), ArrayBuffer(0, 4, 0)) 

Notez que fill vous permet de créer automatiquement et initialiser jusqu'à structures 5D. Notez également que vous pouvez étendre la longueur de ceux-ci, mais cela ne va pas étendre toute la structure multidimensionnelle, juste celle que vous ajoutez. Ainsi, par exemple,

scala> a(2) += 7 // Add one element to the end of the array 
res3: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(0, 4, 0, 7) 

scala> a 
res4: scala.collection.mutable.ArrayBuffer[scala.collection.mutable.ArrayBuffer[Int]] 
= ArrayBuffer(ArrayBuffer(1, 2, 3), ArrayBuffer(0, 0, 0), ArrayBuffer(0, 4, 0, 7)) 
+0

merci beaucoup. – evildead

+0

Je commente ici encore, comme je vois maintenant mon problème utilisait 2.7.7 de ma distribution. Je me demandais pourquoi toutes les choses que j'ai découvertes ne fonctionnent pas pour moi. Maintenant avec 2.8 tout fonctionne bien. J'ai testé ta réponse et tout se passe bien. C'est exactement ce dont j'avais besoin. Merci encore – evildead

4

Eh bien, cela dépend beaucoup de ce que vous avez l'intention de le faire avec, mais votre meilleure estimation est IndexedSeq[IndexedSeq[T]] (ou imbrications plus profondes), en utilisant Vector comme la mise en œuvre pour IndexedSeq (il est l'implémentation par défaut de toute façon).

Par exemple:

scala> IndexedSeq (IndexedSeq (1, 2, 3), IndexedSeq (4, 5), IndexedSeq (6, 7, 8, 9)) res0: IndexedSeq [IndexedSeq [Int ]] = vecteur (Vector (1, 2, 3), le vecteur (4, 5), le vecteur (6, 7, 8, 9))

+0

Salut, thy pour votre réponse. Comment accéder à une seule valeur dans cette IndexSequence, par exemple. deuxième "ligne", deuxième "colonne", res0 (2) (2) ou quelque chose comme ça? – evildead

+2

@evildead: Oui. Mais comme vous le savez sûrement, Scala a un REPL, donc des choses comme ça sont au moins aussi faciles à confirmer empiriquement que d'être confirmées ici. Oh, sauf que la deuxième ligne et la seconde colonne seraient 'vectorOfVectors (1) (1)'. –

+0

Ouais, je veux juste éviter toute erreur :) Et bien sûr, c'est (1) (1), était en retard la nuit dernière. Je vous remercie. – evildead

3

Vous pouvez créer un tableau de 2 obscurcit dynamiquement comme ceci:

val aa : Array[Array[Int]] = Array.ofDim (3, 4) 

Eh bien, oui, je vois, la taille est fixe. Comment à ce sujet:

val i = random.nextInt (5) + 1 
val j = new GregorianCalendar(). get (Calendar.DAY_OF_WEEK) 
val aa : Array[Array[Int]] = Array.ofDim (i, j) 

Oui, il est lié à deux dimensions. Comment utiliseriez-vous un tableau de dimension précédemment inconnue?

bien - au moins, vous pouvez:

val aa : Array [Int] = Array.ofDim (2) 

aa: Array [Int] = Array (0, 0)

val aaa = Array.fill (3) (aa)   

aaa: Array [Array [Int]] = Array (Array (0, 0), Array (0, 0), Array (0, 0))

+0

'aa = Array.ofDim [Int] (3, 4)' est un peu plus agréable et fait la même chose –

Questions connexes