scala - Scala 中的列表串联操作

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

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

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

缺点是List(List("芒果","苹果","葡萄"),"土 bean ","茄子","菠萝蜜") 似乎缺点中的第一个元素仅仅是对水果的引用,因此重复可以忽略不计。但最后三个条目又是蔬菜的主要重复。

最佳答案

In Scala, there are two operations available for List creation from other List objects:conc(:::) and cons(::)

没有。

只有第一个是从 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.ioSerialized] 列表,编译器发现它是 List 和 String 的第一个共同祖先。 cons.size 是 4,而不是 6:水果列表作为第一个元素和 3 种蔬菜。

As original lists are immutable, doesn't it mean now we have duplicated data?

是(和否)。

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)

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

It seems first element in cons is merely reference to fruits, hence negligible duplication. But last three entries are again major duplication from veggies.

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

但是,scala.collection.mutable 中有可变列表,可以就地修改。

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

关于scala - Scala 中的列表串联操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49083082/

相关文章:

arrays - Scala:将数组放入 Set 或 Map 的轻量级方法

scala - 如何在Scala Repl和SBT控制台中关闭/打开Typer阶段

json - 使用 Argonaut 进行 Scalaz 验证

在 C 中创建指向链表的二维指针数组

php - 如何从数组键 => 值中创建一个没有键的简单数组?

Python - 将元组添加到特定位置的现有元组列表

Scala:列出目录中与正则表达式匹配的文件

scala - 如何对 Spark 中数据帧的列执行二进制 "or"操作

c++ - 像素在自行初始化时移动,但不在循环中移动?

python - 是否有更优雅/pythonic 的方式来表达这种结构?