Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Scala中创建不可变的双链接列表?_Scala_Doubly Linked List - Fatal编程技术网

如何在Scala中创建不可变的双链接列表?

如何在Scala中创建不可变的双链接列表?,scala,doubly-linked-list,Scala,Doubly Linked List,有人能帮我在Scala中通过显示一个方法实现来创建不可变的双链表吗?另外,您可以通过实现prepend(元素:Int):DoublyLinkedList[Int]为我提供一个例子吗?按名称调用和lazy-val(按需调用)使不可变的双链接列表成为可能。按名称调用和lazy-val(按需调用)使具有不可变的双链接列表成为可能。以文本版本的链接补充已链接的视频,并包含重要的引号: 这在中进行了描述 在Scala中,双链接列表没有提供太多好处,恰恰相反 因此,从实用的角度来看,这种数据结构是非常无用的

有人能帮我在Scala中通过显示一个方法实现来创建不可变的双链表吗?另外,您可以通过实现prepend(元素:Int):DoublyLinkedList[Int]为我提供一个例子吗?

按名称调用和lazy-val(按需调用)使不可变的双链接列表成为可能。

按名称调用和lazy-val(按需调用)使具有不可变的双链接列表成为可能。

以文本版本的链接补充已链接的视频,并包含重要的引号:

这在中进行了描述

在Scala中,双链接列表没有提供太多好处,恰恰相反

因此,从实用的角度来看,这种数据结构是非常无用的,这就是为什么。。。Scala标准集合库中没有双链接列表

综上所述,双链表是关于不可变数据结构的心智模型的一个很好的练习

想一想:在Java中,此操作将通过3个步骤完成:

  • 新节点
  • 新节点的prev为1
  • 1的下一个节点是新节点
如果我们能执行新的1⇆ 用同样的表达,我们做到了;然后,我们可以递归地将此操作应用于列表的其余部分。奇怪的是,这是可能的

看看
updatePrev
:我们正在创建一个新节点,它的下一个引用立即指向递归调用;递归调用在当前的下一个节点上,它将更新它自己以前对结果的引用,我们仍在定义过程中!只有在存在惰性值和按名称参数的情况下,才可能进行此正向引用

以文本版本的链接补充已链接的视频,并包括重要的引用:

这在中进行了描述

在Scala中,双链接列表没有提供太多好处,恰恰相反

因此,从实用的角度来看,这种数据结构是非常无用的,这就是为什么。。。Scala标准集合库中没有双链接列表

综上所述,双链表是关于不可变数据结构的心智模型的一个很好的练习

想一想:在Java中,此操作将通过3个步骤完成:

  • 新节点
  • 新节点的prev为1
  • 1的下一个节点是新节点
如果我们能执行新的1⇆ 用同样的表达,我们做到了;然后,我们可以递归地将此操作应用于列表的其余部分。奇怪的是,这是可能的

看看
updatePrev
:我们正在创建一个新节点,它的下一个引用立即指向递归调用;递归调用在当前的下一个节点上,它将更新它自己以前对结果的引用,我们仍在定义过程中!只有在存在惰性值和按名称参数的情况下,才可能进行此正向引用


如果创建不可变的双链接列表,那么它的效率将非常低,因为任何返回新列表的操作都需要复制整个列表,这意味着即使是空列表也需要复制,而不是共享。-你为什么需要这个?家庭作业?如果是这样的话,您至少能够实现一个单一的链表吗?当您创建一个新元素时,您可以将引用传递给上一个元素并使其不可变。但是只有在创建这个元素之后,您才有一个可以传递给前一个元素的引用,以便它将其存储为“next”。您也不能有一个
Nil
元素,因为它不能从两个不同的列表中指向前面的两个元素。事实上,在创建新的列表时,不能重用列表中的任何元素。因此,您必须在每次操作中重新分配整个列表,使其基本上成为一个没有O(1)索引访问的无效不可变数组。这是你需要的两个技巧。这能回答你的问题吗?如果创建不可变的双链接列表,那么它的效率将非常低,因为任何返回新列表的操作都需要复制整个列表,这意味着即使是空列表也需要复制,而不是共享。-你为什么需要这个?家庭作业?如果是这样的话,您至少能够实现一个单一的链表吗?当您创建一个新元素时,您可以将引用传递给上一个元素并使其不可变。但是只有在创建这个元素之后,您才有一个可以传递给前一个元素的引用,以便它将其存储为“next”。您也不能有一个
Nil
元素,因为它不能从两个不同的列表中指向前面的两个元素。事实上,在创建新的列表时,不能重用列表中的任何元素。因此,您必须在每次操作中重新分配整个列表,使其基本上成为一个没有O(1)索引访问的无效不可变数组。这是你需要的两个技巧。这能回答你的问题吗?
class DLCons[+T](override val value: T, p: => DLList[T], n: => DLList[T]) extends DLList[T] {
  // ... other methods

  override def updatePrev[S >: T](newPrev: => DLList[S]) = {
    lazy val result: DLCons[S] = new DLCons(value, newPrev, n.updatePrev(result))
    result
  }
  
}