将元素附加到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)