Scala中的列表连接操作

Scala中的列表连接操作,scala,list,Scala,List,在Scala中,有两个操作可用于从其他列表对象创建列表:conc::和cons:: ::展平输入列表中的元素 val fruits = List("Mango","Apple","Grapes"); val veggies = List("Potato","Brinjal","Jackfruit") val conc = fruits:::veggies 浓缩物是芒果、苹果、葡萄、土豆、布林加尔、菠萝蜜。 由于原始列表是不可变的,这不意味着现在我们有了重复的数据吗 如果为:,则会发生以下情况:

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

::展平输入列表中的元素

val fruits = List("Mango","Apple","Grapes");
val veggies = List("Potato","Brinjal","Jackfruit")
val conc = fruits:::veggies
浓缩物是芒果、苹果、葡萄、土豆、布林加尔、菠萝蜜。 由于原始列表是不可变的,这不意味着现在我们有了重复的数据吗

如果为:,则会发生以下情况:

val fruits = List("Mango","Apple","Grapes");
val veggies = List("Potato","Brinjal","Jackfruit")
val cons = fruits::veggies
缺点是芒果、苹果、葡萄、土豆、菠萝蜜、菠萝蜜 cons中的第一个元素似乎只是指水果,因此可以忽略不计重复。但最后三个条目又是来自蔬菜的主要重复

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

不 只有第一个用于从列表对象创建。cons用于从对象创建

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

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]的列表,它是列表和字符串的第一个共同祖先。缺点是大小是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中的第一个元素似乎只是指水果,因此 可忽略的重复。但最后三个条目同样重要 从蔬菜中复制

第一个元素是指水果的第一个元素,第二个元素是指蔬菜的头,因为两个列表都是不可变的。但是水果的最后一个元素,指向零,不能改为指向素食者的头部,因为这会改变水果,这是被禁止的

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


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

问题:不客气。我在中间添加了一个注释,即大小是4,而不是6:水果列表作为第一元素和3个素食。我有一个查询。你说编译器根据几个事物来决定列表类型,比如祖先。你是怎么知道这个细节的?到目前为止,我还没有在任何一本书中找到它。我在哪里可以读到这种语言内部运作的细节。哦,从下面列表中的讨论,从阅读答案和评论,从这里的例子。在Scala land中,静态类型语言与非静态类型语言的讨论是相当严肃的,它通常在类型干扰问题上发挥作用,特别是在编译器无法推断类型或得出不同于预期结果的问题上。但我无法说出具体的来源。Scala类型推断应该是一个很好的搜索词组合。这个答案的两个部分我都有问题。第一部分说cons是从一个对象创建的。那不是真的。以:结尾的运算符是右关联的。所以a::b真的是b:::a。同样,a:::b实际上是b:::a。在这两种情况下,都在列表上调用该方法。不同之处在于预先准备了什么类型。第二部分的问题是,我没有看到任何重复的数据。Scala通过引用做事情。这里没有复制任何字符串。在使用::的示例中,创建了三个新节点,但只有三个,它们引用了原始字符串。我理解这个问题,作为一个问题,两个列表是如何组合成一个列表的,我的回答是,这些操作中只有一个将两个列表,这里是两个字符串列表,组合成一个列表,另一个创建一个其他列表,因为它像对待任何其他对象一样对待参数,并将其作为元素放入列表中。这是从左到右还是从右到左发生在这里并不有趣,因为两个列表的类型相同。在短暂的困惑之后:我没有改变它…