将元素添加到列表中在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)
首先, List
是scala.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)