列出Scala中的连接操作

时间:2018-03-03 10:18:20

标签: scala list

在Scala中,有两个操作可用于从其他List对象创建List:conc(:: :)和cons(::)

:::从输入列表中展平元素。

val fruits = List("Mango","Apple","Grapes");
val veggies = List("Potato","Brinjal","Jackfruit")
val conc = fruits:::veggies

conc是List(" Mango"," Apple"," Grapes"" Potato"" Brinjal&#34 ;,"菠萝蜜&#34)。 由于原始列表是不可变的,这是不是意味着现在我们有重复的数据?

在::的情况下,会发生这种情况:

val fruits = List("Mango","Apple","Grapes");
val veggies = List("Potato","Brinjal","Jackfruit")
val cons = fruits::veggies

缺点是List(List(" Mango"," Apple"," Grapes")," Potato","茄子""菠萝蜜&#34) 似乎缺点的第一个要素仅仅是水果的参考,因此可以忽略不计。但最后三个条目再次是蔬菜的主要重复。

1 个答案:

答案 0 :(得分:4)

  

在Scala中,有两个可用于创建列表的操作   其他List对象:conc(:: :)和cons(::)

没有

只有第一个用于从List对象创建。缺点是从Objects创建。

由于Lists是对象本身,因此您可以将List作为元素放入另一个List中,但在几乎所有情况下,您都不想这样做。

scala> val fruits = List("Mango","Apple","Grapes");
fruits: List[String] = List(Mango, Apple, Grapes)

scala> val veggies = List("Potato","Brinjal","Jackfruit")
veggies: List[String] = List(Potato, Brinjal, Jackfruit)

scala> val cons = fruits::veggies
cons: List[java.io.Serializable] = List(List(Mango, Apple, Grapes), Potato, Brinjal, Jackfruit)

请参阅第三个列表的类型如何变化:它是[java.ioSerializable]的列表,列表和字符串的第一个共同祖先,编译器找到。 cons.size是4,而不是6:水果列表作为第一元素和3个蔬菜。

  

由于原始列表是不可变的,所以现在我们没有   重复的数据?

是(否)。

scala> val fruits = List ("Mango","Apple","Grapes");
fruits: List[String] = List(Mango, Apple, Grapes)

scala> val veggies = List ("Potato","Brinjal","Jackfruit")
veggies: List[String] = List(Potato, Brinjal, Jackfruit)

scala> val conc = fruits ::: veggies
conc: List[String] = List(Mango, Apple, Grapes, Potato, Brinjal, Jackfruit)

你得到了,你要求的东西,水果是不可改变的,所以你不能附加蔬菜,所以没有办法解决它。

  

似乎 cons 中的第一个元素仅仅是对水果的引用,因此   可忽略不计的重复。但最后三个条目再次成为主流   蔬菜复制。

第一个元素是对fruits的第一个元素的引用,第二个元素是引用veggies的头部,因为两个列表都是不可变的。但是水果的最后一个元素,指向Nil,不能改为指向蔬菜的头部,因为这会改变水果,这是禁止的。

但是,scala.collection.mutable中有可变列表,可以在适当的位置进行修改。

在许多情况下,您不需要担心记忆。 3个列表,2个原始列表和组合主要是指向字符串的链接(它们不需要自己存储整个字符串,因为字符串也是不可变的),并且每个元素都有到下一个字符串的链接列表中的元素。