在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) 似乎缺点的第一个要素仅仅是水果的参考,因此可以忽略不计。但最后三个条目再次是蔬菜的主要重复。
答案 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个原始列表和组合主要是指向字符串的链接(它们不需要自己存储整个字符串,因为字符串也是不可变的),并且每个元素都有到下一个字符串的链接列表中的元素。