Il existe plusieurs façons de construire une liste immuable dans Scala (voir l'exemple de code artificiel ci-dessous). Vous pouvez utiliser un ListBuffer mutable, créer unvar
liste et la modifier, utiliser une méthode récursive de queue , et probablement d'autres que je ne connais pas.
Instinctivement, j'utilise le ListBuffer, mais je n'ai pas de bonne raison de le faire. Existe-t-il une méthode préférée ou idiomatique pour créer une liste, ou y a-t-il des situations qui conviennent le mieux à une méthode plutôt qu'à une autre?
import scala.collection.mutable.ListBuffer
// THESE are all the same as: 0 to 3 toList.
def listTestA() ={
var list:List[Int] = Nil
for(i <- 0 to 3)
list = list ::: List(i)
list
}
def listTestB() ={
val list = new ListBuffer[Int]()
for (i <- 0 to 3)
list += i
list.toList
}
def listTestC() ={
def _add(l:List[Int], i:Int):List[Int] = i match {
case 3 => l ::: List(3)
case _ => _add(l ::: List(i), i +1)
}
_add(Nil, 0)
}
What you DON'T do is use a List and append to it
Est-ce parce qu'une nouvelle liste est créée? Alors que l'utilisation d'une opération de préfixe ne créera pas une nouvelle liste?Nil
. Deuxièmement, il n'y a aucune copie d'aucune sorte en préfixe: un élément est créé en pointant vers la liste existante, et c'est tout.Et pour les cas simples:
:)
la source
Euhmm .. cela me semble trop complexe. Puis-je proposer
ou
la source
Vous voulez vous concentrer sur l'immuabilité dans Scala généralement en éliminant toutes les variables. La lisibilité est toujours importante pour votre prochain, donc:
Essayer:
Vous n'avez probablement même pas besoin de convertir en liste dans la plupart des cas :)
Le seq indexé aura tout ce dont vous avez besoin:
Autrement dit, vous pouvez maintenant travailler sur cet IndexedSeq:
la source
Vector
est désormais également l'Seq
implémentation par défaut .Je préfère toujours List et j'utilise "plier / réduire" avant "pour la compréhension". Cependant, «pour la compréhension» est préférable si des «plis» imbriqués sont nécessaires. La récursivité est le dernier recours si je ne peux pas accomplir la tâche en utilisant "plier / réduire / pour".
donc pour votre exemple, je vais faire:
avant moi:
Remarque: j'utilise "foldRight (: \)" au lieu de "foldLeft (/ :)" ici à cause de l'ordre des "_". Pour une version qui ne lève pas StackOverflowException, utilisez plutôt "foldLeft".
la source
((0 to 3) :\ List[Int]())(_ :: _)
émoticode?En utilisant
List.tabulate
, comme ça,la source
Remarque: Cette réponse est écrite pour une ancienne version de Scala.
Les classes de la collection Scala vont être repensées à partir de Scala 2.8, alors soyez prêt à changer très bientôt la façon dont vous créez des listes.
Quelle est la méthode compatible avec la transmission avant de créer une liste? Je n'en ai aucune idée car je n'ai pas encore lu la documentation 2.8.
Un document PDF décrivant les modifications proposées des classes de collection
la source
En tant que nouveau développeur scala, j'ai écrit un petit test pour vérifier le temps de création de la liste avec les méthodes suggérées ci-dessus. Cela ressemble à (for (p <- (0 to x)) yield p) toList l'approche la plus rapide.
la source
juste un exemple qui utilise collection.breakOut
la source
Pour créer une liste de chaînes, utilisez ce qui suit:
la source