如何在scala列表中查找可重复元素的数量

时间:2013-01-26 05:43:29

标签: list scala

假设您有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

的情况

任何指针都将不胜感激

4 个答案:

答案 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

如果您对其实施方式有任何疑问,请查看并告诉我。