2

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

4 に答える 4

7

GenSeqLikeこれには、 (Listから継承する)メソッドもありますprefixLength。それは非常に短い答えになります:

s.prefixLength(_==s.head)
于 2013-01-26T13:20:51.797 に答える
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最初の要素を使用してカウントが実行されます。これが私があなたのコードを書き直す方法です:zsxs

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

実装方法について質問がある場合は、ご覧になり、お知らせください。

于 2013-01-26T06:35:02.443 に答える
2
xs.headOption.map(h => xs.takeWhile(_ == h).size).getOrElse(0)
于 2013-01-26T05:49:01.757 に答える
2

別のアプローチ:

xs.span(_ == xs.head)._1.size
于 2013-01-26T06:14:00.297 に答える