在 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/