添加到自定义列表的末尾

时间:2013-04-10 22:48:27

标签: scala

我正在做一个scala课程,在一项任务中我想添加到自定义列表的末尾。

trait EntityList {
  def head: Entity
  def tail: EntityList
  def isEmpty: Boolean
}

object Nil extends EntityList {
  def head = throw new java.util.NoSuchElementException("head of EmptyList")
  def tail = throw new java.util.NoSuchElementException("tail of EmptyList")
  def isEmpty = true
}

class Cons(val head: Entity, val tail: EntityList) extends EntityList {
  def isEmpty = false
}

我可以在列表的开头添加一个新元素,并通过执行以下操作创建一个新列表:

new Cons(myNewElement, myExistingList)

但是如何使用添加到自定义列表末尾的新元素创建新列表?

1 个答案:

答案 0 :(得分:4)

对于“股票”(标准图书馆)List

val l1 = List(1, 2, 3)
l1: List[Int] = List(1, 2, 3)

val l2 = l1 :+ 4
l2: List[Int] = List(1, 2, 3, 4)

val l3 = l2 ++ List(5, 6, 7, 8)
l3: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8)

但是,您应该仔细考虑尝试将新元素添加到cons-cell列表的 end 的后果,例如List(以及您的“自定义”列表),因为那是非常低效的。通常当你想要这个结果时,你会编写一个递归算法,以向后的顺序产生你想要的列表('因为你做了有效的事情并将新生成的元素添加到累积列表的头部)然后当完成所有这些时,反转向后列表以获得正确的序列。

对于“自定义”列表

对于没有Scala List的细节的基本cons-cell列表,你只能从前面构建。在这种情况下,通过向前面添加新元素来构建列表(您可以做的唯一事情)然后编写reverse算法以获得所需序列中的列表。

<强>附录

我想我没有回答这个问题。如果您的目标/要求是将新元素追加到最后,那么您需要做的是创建一个仅包含该元素的新列表,并逐个(递归地)将现有列表的每个元素从前一个添加到首先!理想情况下,您可以使用尾递归实现来执行此操作。如果你在开始之前没有理解追加效率低的问题,那么一旦你完成它就会完成。