web-dev-qa-db-fra.com

Ajout d'un élément à la fin d'une liste dans Scala

Cela ressemble à une question stupide, mais tout ce que j'ai trouvé sur Internet était une ordure. Je ne peux tout simplement pas ajouter d'élément de type T dans une liste List[T]. J'ai essayé avec myList ::= myElement mais il semble que cela crée un objet étrange et l'accès à myList.last renvoie toujours le premier élément placé dans la liste.

199
Masiar
List(1,2,3) :+ 4

Results in List[Int] = List(1, 2, 3, 4)

Notez que cette opération a une complexité de O (n). Si vous avez souvent besoin de cette opération ou pour de longues listes, envisagez d'utiliser un autre type de données (par exemple, un ListBuffer).

361
Landei

C'est parce que vous ne devriez pas le faire (au moins avec une liste immuable). Si vous avez vraiment besoin d'ajouter un élément à la fin d'une structure de données et que cette structure de données doit vraiment être une liste et que cette liste doit vraiment être immuable, faites ceci:

(4 :: List(1,2,3).reverse).reverse

ou ça:

List(1,2,3) ::: List(4)
65
agilesteel

Les listes dans Scala ne sont pas conçues pour être modifiées. En fait, vous ne pouvez pas ajouter d'éléments à un Scala List ; c'est une structure de données immuable, comme une chaîne Java. Ce que vous faites réellement lorsque vous "ajoutez un élément à une liste" dans Scala consiste à créer une nouvelle liste à partir d'une liste existante. (Source)

Au lieu d'utiliser des listes pour de tels cas d'utilisation, je suggère d'utiliser un ArrayBuffer ou un ListBuffer . Ces infrastructures de données sont conçues pour ajouter de nouveaux éléments.

Enfin, une fois que toutes vos opérations sont terminées, le tampon peut être converti en une liste. Voir l'exemple REPL suivant:

scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer

scala> var fruits = new ListBuffer[String]()
fruits: scala.collection.mutable.ListBuffer[String] = ListBuffer()

scala> fruits += "Apple"
res0: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple)

scala> fruits += "Banana"
res1: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple, Banana)

scala> fruits += "Orange"
res2: scala.collection.mutable.ListBuffer[String] = ListBuffer(Apple, Banana, Orange)

scala> val fruitsList = fruits.toList
fruitsList: List[String] = List(Apple, Banana, Orange)
22
Markus Weninger

Ceci est similaire à l'une des réponses mais de manière différente:

scala> val x=List(1,2,3)
x: List[Int] = List(1, 2, 3)

scala> val y=x:::4::Nil
y: List[Int] = List(1, 2, 3, 4)
3
Venkat

Nous pouvons ajouter ou ajouter deux listes ou une liste et un tableau
Append:

var l = List(1,2,3)    
l=l:+4 
Result : 1 2 3 4  
var ar = Array(4,5,6)    
for(x<-ar)    
{ l=l:+x}  
  l.foreach(println)

Result:1 2 3 4 5 6

en attente:

var l = List[Int]()  
   for(x<-ar)  
    { l=x::l } //prepending    
     l.foreach(println)   

Result:6 5 4 1 2 3
1