将元素添加到列表中在Scala中

我正在运行Scala 2.10.2。 我想创build一个列表,然后添加一些元素到列表中,当我调用列表的名字时,期望看到列表中的所有元素。 但是我观察到一些很奇怪的东西(至less对我来说是怪异的,因为我是一个新手)。 以下是我在sbt console试图做的sbt console

 scala> val l = 1.0 :: 5.5 :: Nil l: List[Double] = List(1.0, 5.5) scala> l res0: List[Double] = List(1.0, 5.5) scala> l ::: List(2.2, 3.7) res1: List[Double] = List(1.0, 5.5, 2.2, 3.7) scala> List(l) :+ 2.2 res2: List[Any] = List(List(1.0, 5.5), 2.2) scala> l res3: List[Double] = List(1.0, 5.5) scala> 

首先,我创build了两个元素(1.0和5.5)的列表l 。 我打电话给l并得到我的期望; 这两个要素。 现在我尝试使用:::添加另一个元素到列表中,这个元素返回了一个新的列表,添加了一个新添加的元素列表(2.2和3.7)。 我甚至检查了其他人的代码以获得帮助: 将一个元素附加到Scala中的列表末尾以使用新的构造:+ 。 所以在这个阶段,我很高兴,但我打电话给l ,我得到了意想不到的:`res3:List [Double] = List(1.0,5.5)'。

我添加的元素在哪里? 如何正确地添加这些元素,以便在我调用l时添加所有我添加的东西的新列表?

你正在使用一个不可变的列表。 列表上的操作返回一个新的列表。 旧名单保持不变。 如果另一个类/方法持有对原始集合的引用并且依赖于它保持不变,这可能是非常有用的。 您可以使用不同的命名val

 val myList1 = 1.0 :: 5.5 :: Nil val myList2 = 2.2 :: 3.7 :: mylist1 

或者使用var作为

 var myList = 1.0 :: 5.5 :: Nil myList :::= List(2.2, 3.7) 

这是等同的语法:

 myList = myList.:::(List(2.2, 3.7)) 

或者你可以使用一个可变的集合,如

 val myList = scala.collection.mutable.MutableList(1.0, 5.5) myList.++=(List(2.2, 3.7)) 

不要与以下不会修改原始的可变列表相混淆,但返回一个新的值:

 myList.++:(List(2.2, 3.7)) 

但是,您应该只在性能关键代码中使用可变集合。 不可变的集合更容易推理和使用。 一个很大的好处是不可变的List和scala.collection.immutable.Vector是Covariant。 不要担心,如果这对你还没有任何意义的话。 它的好处是你可以使用它,但不能完全理解它。 因此,默认使用的集合实际上是scala.collection.immutable.List,它只是自动为您导入。

注意:我个人使用Seq作为我的默认集合。 这使用不可变的Seq特质。 列表/vector/数组是性能而非function的实现细节。 列表对小集合更有效。

如果你真的需要突变,请使用import scala.collection.mutable.MutableList或类似的方法。

 import scala.collection.mutable.MutableList val x = MutableList(1, 2, 3, 4, 5) x += 6 // MutableList(1, 2, 3, 4, 5, 6) x ++= MutableList(7, 8, 9) // MutableList(1, 2, 3, 4, 5, 6, 7, 8, 9) 

我将尝试解释你所尝试的所有命令的结果。

 scala> val l = 1.0 :: 5.5 :: Nil l: List[Double] = List(1.0, 5.5) 

首先, Listscala.collection.immutable.List一个types别名(在Predef.scala中定义)。

使用List伴侣对象是实例化List更直接的方法。 例如: List(1.0,5.5)

 scala> l res0: List[Double] = List(1.0, 5.5) scala> l ::: List(2.2, 3.7) res1: List[Double] = List(1.0, 5.5, 2.2, 3.7) 

:::返回给定列表前缀和此列表的连接所产生的列表

原始列表不被修改

 scala> List(l) :+ 2.2 res2: List[Any] = List(List(1.0, 5.5), 2.2) 

List(l)List[List[Double]]绝对不是你想要的。

:+返回一个新的列表,其中包含这个列表的所有元素,后面跟着elem。

types是List[Any]因为它是List[Double]Double之间的公共超类

 scala> l res3: List[Double] = List(1.0, 5.5) 

因为在immutable.List上没有方法修改了List,所以没有修改。

既然你想追加元素到现有的列表,你可以使用var List [Int],然后继续添加元素到同一个列表。 注意 – >你必须确保你插入一个元素到现有的列表如下:

var l:List [int] = List()//创build一个空列表

l = 3 :: l //将3添加到列表的头部

l = 4 :: l //将int 4作为列表的头部

//现在当你打印l时,你会在列表中看到两个元素(4,3)