我正在做一个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)
但是如何使用添加到自定义列表末尾的新元素创建新列表?
答案 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
算法以获得所需序列中的列表。
<强>附录强>
我想我没有回答这个问题。如果您的目标/要求是将新元素追加到最后,那么您需要做的是创建一个仅包含该元素的新列表,并逐个(递归地)将现有列表的每个元素从前一个添加到首先!理想情况下,您可以使用尾递归实现来执行此操作。如果你在开始之前没有理解追加效率低的问题,那么一旦你完成它就会完成。