Özyineleme kullanarak sorunu 13 here'dan çözmeye çalışıyorum, ancak bir hata alıyorum (anlamadığım).Yinelenen öğeleri sayma listesine dönme
sorundur:
List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e)
Ben tekrarlanan elemanları dönmek ve saymak gerekir listesi verilmiş:
object P13 extends App {
val ls2 = List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e)
println(ls2)
println(encodeDirect(ls2))
def encodeDirect[A](ls: List[A]): List[(Int,A)] = ls match {
case h :: tail => (ls.takeWhile(_ == h).count(_), h) +: encodeDirect (ls.dropWhile (_ == h))
case Nil => Nil
}
}
:
List((4,'a), (1,'b), (2,'c), (2,'a), (1,'d), (4,'e))
Bu benim kodudur
Bu hata:
P13.scala:18: error: type mismatch;
found : List[(Any, A)]
required: List[(Int, A)]
case h :: tail => (ls.takeWhile(_ == h).count(_), h) +: encodeDirect
(ls.dropWhile (_ == h))
^
one error found
Neden böyle oluyor ve bunu nasıl düzeltebiliriz? size
adil koleksiyonun uzunluğunu dönecektir-
def encodeDirect[A](ls: List[A]): List[(Int,A)] = ls match {
case h :: tail => (ls.takeWhile(_ == h).size, h) +: encodeDirect (ls.dropWhile (_ == h))
case Nil => Nil
}
count
, yüklem alıp o yüklemi eşleşecek elemanların sayısını hesaplar:
, tüm yüklemleri eşleştirip "beden" ile eşdeğer olmamalıdır (_); – ps0604
@ ps0604, aslında, hayır. 'Say''daki öntanımlılık işlevi' T => Bool''dur, bu yüzden muhtemelen saymayı deniyorsunuz (_ => doğru). Bu, 'size', sadece daha az verimli eşdeğer olacaktır. – Aivean