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

我不能将类型为T的元素添加到列表List[T]中。 我尝试使用myList ::= myElement,但似乎它创建了一个奇怪的对象,访问myList.last总是返回放在列表中的第一个元素。我该如何解决这个问题呢?< / p >
281467 次浏览
这是因为你不应该这样做(至少对于一个不可变列表)。 如果你真的需要在一个数据结构的末尾添加一个元素,而这个数据结构真的需要是一个列表,而且这个列表真的必须是不可变的,那么可以这样做:

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

或者:

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


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

注意,这个操作的复杂度为O(n)。如果你经常需要这个操作,或者对于很长的列表,考虑使用另一种数据类型(例如ListBuffer)。

Scala中的列表不是为修改而设计的。事实上,你不能在Scala List;它是一个不可变数据结构,就像一个Java字符串。 当你在Scala中“向列表中添加元素”时,你实际上要做的是创建从现有的List中创建新的List(源) < / p >

对于这样的用例,我建议使用ArrayBufferListBuffer,而不是使用列表。这些数据结构被设计为添加新元素。

最后,在所有操作完成后,可以将缓冲区转换为列表。请看下面的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)
我们可以添加或前置两个列表或list&array
附加:< / >强

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)

List在Scala中是不可变的

你可以使用MutableList

var l = scala.collection.mutable.MutableList(1,2,3)
l += 4