0

我正在上一门 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)

但是如何在自定义列表的末尾添加一个新元素来创建一个新列表?

4

1 回答 1

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 列表(例如(和您的“自定义”列表))末尾的后果,因为这非常低效List通常,当你想要这个结果时,你会编写一个递归算法,以倒序生成你想要的列表(因为你做了有效的事情并将新生成的元素添加到累积列表的头部),然后当所有这些都完成后,反转后向列表以获得正确的序列。

对于您的“自定义”列表

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

附录

我想我并没有真正回答这个问题。如果您的目标/要求是将一个新元素附加到末尾,那么您需要做的是创建一个仅包含该元素的新列表,并一个一个(递归地)将现有列表的每个元素从最后一个添加到第一个!理想情况下,您会使用尾递归实现来做到这一点。如果您在开始之前不了解附加的低效率,那么您一旦完成就会了解。

于 2013-04-10T23:09:56.483 回答