列出Scala中的连接操作

问题描述 投票:2回答:1

在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”,“Jackfruit”)。由于原始列表是不可变的,这是不是意味着现在我们有重复的数据?

如果是::,会发生这种情况:

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

缺点是List(List(“Mango”,“Apple”,“Grapes”),“Potato”,“Brinjal”,“Jackfruit”)似乎缺点中的第一个元素仅仅是指水果,因此可以忽略不计重复。但是最后三个条目再次是蔬菜的主要重复。

scala list
1个回答
4
投票

在Scala中,有两个操作可用于从其他List对象创建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)

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

似乎缺点的第一个要素仅仅是对水果的参考,因此可以忽略不计的重复。但最后三个条目再次是蔬菜的重复。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.