【发布时间】:2021-06-24 20:08:45
【问题描述】:
我在 Scala 中有一个练习,我必须将这种列表 (a,a,a,b,c,d,d,e,a,a) 转换为 ((a,3),(b,1),(c,1),(d,2),(e,1),(a,2))。 我显然知道我的算法还不正确,但我想从任何事情开始。 问题是我不知道如何打开该功能(最后一行),因为错误是无论我采用什么作为先前的参数,它都说需要:A,找到:Int/String 等。 前一个是作为前一个迭代的负责人。
def compress[A](l: List[A]): List[(A, Int)] = {
def compressHelper(l: List[A], acc: List[(A, Int)], previous: A, counter: Int): List[(A, Int)] = {
l match {
case head::tail => {
if (head == previous) {
compressHelper(tail, acc :+ (head, counter+1), head, counter+1)
}
else {
compressHelper(tail, acc :+ (head, counter), head, 1)
}
}
case Nil => acc
}
}
compressHelper(l, List(), , 1)
}
【问题讨论】:
-
你不能使用
Option[A]来代替,特别是因为你不会总是有前一个元素。
标签: scala design-patterns pattern-matching matching tail-recursion