假设您有List(1,1,1,4,4,1)
并且必须计算连续重复的列表头部元素的次数。在上面的例子中,方法应该返回3.在这个方法中我们只关心第一个元素。
我走到这一步并陷入困境。鉴于第一个不可重复的角色,我想打破,怎么样?
def firstRepeated [X] (xs: List[X]) : Int = xs match {
case Nil => 0
case y::ys => ys match {
case Nil => 0
case z::zs => if (y == z) 1 + firstRepeated(zs) else // break
}
}
此外,在上面的代码中,我认为我没有正确处理列表为z::Nil
任何指针都将不胜感激
答案 0 :(得分:7)
GenSeqLike
中有一种方法(List
继承自)prefixLength
。
这是一个非常简短的答案:
s.prefixLength(_==s.head)
答案 1 :(得分:2)
xs.headOption.map(h => xs.takeWhile(_ == h).size).getOrElse(0)
答案 2 :(得分:2)
另一种方法:
xs.span(_ == xs.head)._1.size
答案 3 :(得分:2)
我将如何做到这一点:
def getHeadCount(xs:List[Int]) = xs.count(_==xs.head)-1
val x = List(1,1,1,4,4,1)
getHeadCount(x) //Returns 3
但要回答你的问题,你真的不需要打破。我已经完成了你的代码,基本问题在于
case z::zs => if (y == z) 1 + firstRepeated(zs) else // break
zs
此处不再是您的原始数组,并且运行firstRepeated
将使用zs
中的第一个元素进行计数,该元素可能是也可能不是{{xs
中的第一个元素1}}。以下是我重写代码的方法:
def firstRepeated[X](xs: List[X]): Int = xs match {
case Nil => 0
case y :: ys => ys match {
case Nil => 0
case z :: zs => {
if (y == z) {
//println(zs)
1 + firstRepeated(z :: zs)
} else {
firstRepeated(y :: zs)
}
}
}
} //> firstRepeated: [X](xs: List[X])Int
val x = List(1, 1, 1, 4, 4, 1) //> x : List[Int] = List(1, 1, 1, 4, 4, 1)
firstRepeated(x) //> res0: Int = 3
如果您对其实施方式有任何疑问,请查看并告诉我。