将元素添加到列表中Scala

Emm*_*uel 34 scala list

我正在运行Scala 2.10.2.我想创建一个列表,然后在列表中添加一些元素,并期望在调用列表名称时查看列表中的所有元素.但我观察到一些非常奇怪的东西(因为我是新手,至少对我来说很奇怪).以下是我试图做的事情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> 
Run Code Online (Sandbox Code Playgroud)

首先,我创建了l包含2个元素(1.0和5.5)的列表.我打电话l给我所期待的; 这两个要素.现在我尝试在列表中添加另一个元素,使用:::该元素返回一个新列表,其中包含我添加的新元素列表(2.2和3.7)Sweet!我甚至检查了别人的代码以寻求帮助:在Scala的列表末尾添加一个元素以使用新的构造:+.所以在这个阶段我很高兴,但我打电话给l我意外:`res3:List [Double] = List(1.0,5.5)'.

我添加的元素在哪里?我如何正确添加这些元素,以便在我打电话时l获得一个包含我添加的所有内容的新列表?

Ric*_*ver 44

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

val myList1 = 1.0 :: 5.5 :: Nil 
val myList2 = 2.2 :: 3.7 :: mylist1
Run Code Online (Sandbox Code Playgroud)

或使用var作为

var myList = 1.0 :: 5.5 :: Nil 
myList :::= List(2.2, 3.7)
Run Code Online (Sandbox Code Playgroud)

这是等效的语法:

myList = myList.:::(List(2.2, 3.7))
Run Code Online (Sandbox Code Playgroud)

或者您可以使用其中一个可变集合,例如

val myList = scala.collection.mutable.MutableList(1.0, 5.5)
myList.++=(List(2.2, 3.7))
Run Code Online (Sandbox Code Playgroud)

不要与不修改原始可变List的以下内容混淆,但返回一个新值:

myList.++:(List(2.2, 3.7))
Run Code Online (Sandbox Code Playgroud)

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

我倾向于使用List作为我的默认集合.从2.12.6 Seq默认为不可变的Seq,在此之前它默认为不可变.


Ant*_*oly 11

如果你真的需要变异,请使用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)
Run Code Online (Sandbox Code Playgroud)


Yan*_*san 8

我将尝试解释您尝试的所有命令的结果.

scala> val l = 1.0 :: 5.5 :: Nil
l: List[Double] = List(1.0, 5.5)
Run Code Online (Sandbox Code Playgroud)

首先,List是一个类型别名scala.collection.immutable.List(在Predef.scala中定义).

使用List伴随对象是实例化a的更直接的方法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)
Run Code Online (Sandbox Code Playgroud)

::: 返回由给定列表前缀和此列表的串联产生的列表

原始列表未被修改

scala> List(l) :+ 2.2
res2: List[Any] = List(List(1.0, 5.5), 2.2)
Run Code Online (Sandbox Code Playgroud)

List(l)是一种List[List[Double]]绝对不是你想要的.

:+ 返回一个新列表,其中包含此列表的所有元素,后跟elem.

类型是List[Any]因为它是List[Double]和之间的共同超类Double

scala> l
res3: List[Double] = List(1.0, 5.5)
Run Code Online (Sandbox Code Playgroud)

l未经修改,因为没有immutable.List修改List的方法.