将元素附加到Scala中的列表的末尾

这听起来像一个愚蠢的问题,但我在互联网上find的只是垃圾。 我根本不能将T型元素添加到列表List[T] 。 我尝试了myList ::= myElement但它似乎创build了一个奇怪的对象,并访问myList.last总是返回放在列表中的第一个元素。

 List(1,2,3) :+ 4 //--> List[Int] = List(1, 2, 3, 4) 

请注意,这个操作的复杂度为O(n)。 如果您经常需要此操作,或者对于长列表,请考虑使用其他数据types(例如ListBuffer)。

那是因为你不应该这样做(至less在一个不可变的列表中)。 如果你确实需要将一个元素附加到数据结构的末尾,那么这个数据结构真的需要成为一个列表,而这个列表真的必须是不可变的,然后才能做到这一点:

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

或者那个:

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

Scala中的列表不能被修改。 实际上,您不能将元素添加到Scala List ; 它是一个不可变的数据结构 ,就像一个Javastring。 当你在Scala中“添加一个元素到一个列表”时,你实际做的是从现有的列表中创build一个新的列表 。 (资源)

我build议使用一个ArrayBuffer或一个ListBuffer ,而不是使用这种用例的ListBuffer 。 这些数据结构被devise为添加新的元素。

最后,在完成所有操作之后,缓冲区就可以转换成一个列表。 看下面的REPL例子:

 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) 

我们可以追加或者添加两个列表或者列表&数组
附加:

 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 

预先考虑:

 var l = List[Int]() for(x<-ar) { l=x::l } //prepending l.foreach(println) Result:6 5 4 1 2 3 

这与其中一个答案类似,但方式不同:

 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)