当类型为A(Scala)时,设置什么作为默认值
我在Scala中做了一个练习,我必须将这种列表(a,a,a,b,c,d,d,e,a,a)转换为 ((a,3)、(b,1)、(c,1)、(d,2)、(e,1)、(a,2))。 我显然知道我的算法还不正确,但我想从任何事情开始。 问题是,我不知道如何打开函数(最后一行),因为错误是,无论我取什么作为“previous”参数,它都会说required:A,find:Int/String等。 上一次迭代的目的是作为上一次迭代的负责人当类型为A(Scala)时,设置什么作为默认值,scala,design-patterns,pattern-matching,matching,tail-recursion,Scala,Design Patterns,Pattern Matching,Matching,Tail Recursion,我在Scala中做了一个练习,我必须将这种列表(a,a,a,b,c,d,d,e,a,a)转换为 ((a,3)、(b,1)、(c,1)、(d,2)、(e,1)、(a,2))。 我显然知道我的算法还不正确,但我想从任何事情开始。 问题是,我不知道如何打开函数(最后一行),因为错误是,无论我取什么作为“previous”参数,它都会说required:A,find:Int/String等。 上一次迭代的目的是作为上一次迭代的负责人 def compress[A](l: List[A]): List[(
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)
}
您不需要显式地传递
previous
,只需查看累加器:
def compress[A](l: List[A], acc: List[(A, Int)]=Nil): List[(A, Int)] =
(l, acc) match {
case (Nil, _) => acc.reverse
case (head :: tail, (a, n) :: rest) if a == head =>
compress(tail, (a, n+1) :: rest)
case (head :: tail, _) => compress (tail, (head, 1) :: acc)
}
不能这样做,特别是因为您不会总是有上一个元素,所以请改用
选项[a]
。类型不匹配。Required:List[(A,Int)],find:Iterable[(A,Int)]我在尝试编译时遇到这种错误。这是关于acc.reversedok,我的错,这只是关于acc.reverse,而不是reversed:)谢谢。我有一个问题-你用(a,n)::rest,因为这个列表就像那个列表((a,b))。例如,如果我有一个类似列表((a,b,c,d),(e,f,g,h))的列表,我必须写(a,b,c,d)::rest而不是head::tail?因此,使用head::tail仅适用于列表中有单个元素时的情况?@squallhead::tail
将列表解构为第一个元素和其余元素。如果列表中包含元组,那么head
的值将最终成为元组(比如(a、b、c、d)
或其他)。如果您不关心元组的单个元素,只需要整个元组,那么仍然可以执行head::tail
。或者你可以进一步解构它,比如(a,uu,c,u)::tail
。您可以根据需要嵌套这些不匹配的内容<代码>案例(一些((a,b,c))::::。(x::y::z::,):::tail=>…