82 votes

Comment déclarer la liste vide, puis ajouter une chaîne à la scala?

J'ai un code comme ceci:

val dm  = List[String]()
val dk = List[Map[String,Object]]()

.....

dm.add("text")
dk.add(Map("1" -> "ok"))

mais il jette le runtime java.lang.UnsupportedOperationException.

J'ai besoin de déclarer la liste vide ou vide, des cartes et d'autres où plus tard dans le code nécessaire de les remplir.

120voto

paradigmatic Points 20871

Scala listes sont immuables par défaut. Vous ne pouvez pas "ajouter" un élément, mais vous pouvez former une nouvelle liste en ajoutant l'élément nouveau de l'avant. Puisque c'est une nouvelle liste, vous devez réaffecter la référence (si vous ne pouvez pas utiliser de val).

var dm  = List[String]()
var dk = List[Map[String,AnyRef]]()

.....

dm = "text" :: dm
dk = Map(1 -> "ok") :: dk

L'opérateur :: crée la nouvelle liste. Vous pouvez également utiliser la syntaxe plus courte:

dm ::= "text" 
dk ::= Map(1 -> "ok")

NB: Dans la scala de ne pas utiliser le type Object mais Any, AnyRef ou AnyVal.

17voto

Daniel C. Sobral Points 159554

Si vous avez besoin de muter des trucs, utilisez ArrayBuffer ou LinkedBuffer à la place. Cependant, il serait préférable de répondre à cette déclaration:

J'ai besoin de déclarer la liste vide ou vide cartes et d'autres où plus tard dans le code besoin de les remplir.

Au lieu de cela, remplir la liste de code qui renvoie les éléments. Il y a beaucoup de façons de le faire, et je vais vous donner quelques exemples:

// Fill a list with the results of calls to a method
val l = List.fill(50)(scala.util.Random.nextInt)

// Fill a list with the results of calls to a method until you get something different
val l = Stream.continually(scala.util.Random.nextInt).takeWhile(x => x > 0).toList

// Fill a list based on its index
val l = List.tabulate(5)(x => x * 2)

// Fill a list of 10 elements based on computations made on the previous element
val l = List.iterate(1, 10)(x => x * 2)

// Fill a list based on computations made on previous element, until you get something
val l = Stream.iterate(0)(x => x * 2 + 1).takeWhile(x => x < 1000).toList

// Fill list based on input from a file
val l = (for (line <- scala.io.Source.fromFile("filename.txt").getLines) yield line.length).toList

14voto

agilesteel Points 8330

Comme tout le monde l'a déjà mentionné, ce n'est pas la meilleure façon d'utiliser les listes de Scala...

scala> val list = scala.collection.mutable.MutableList[String]()
list: scala.collection.mutable.MutableList[String] = MutableList()

scala> list += "hello"
res0: list.type = MutableList(hello)

scala> list += "world"
res1: list.type = MutableList(hello, world)

scala> list mkString " "
res2: String = hello world

2voto

DaVinci Points 871

Par défaut collections scala sont immuables, de sorte que vous avez une méthode qui renvoie une nouvelle liste avec l'élément ajouté. Si vous avez vraiment besoin de quelque chose comme une méthode add vous avez besoin d'une mutable collection, par exemple http://www.scala-lang.org/api/current/scala/collection/mutable/MutableList.html qui a a += méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X