Comment créer une liste à partir d'une plage
Question
Je suis nouveau à Scala, je viens tout juste d’apprendre, c’est donc une question de base pour débutant.
J'essaie d'implémenter l'algorithme Sieve of Eratosthenes . Voici ce que j'ai obtenu jusqu'à présent:
def sieve_core(cross: Int, lst: Seq[Int]): List[Int] = { val crossed = lst.filter(_ % cross != 0) crossed match { case a :: rest => cross :: sieve_core(a, crossed) case _ => cross :: Nil } } def sieve(max: Int): List[Int] = { sieve_core(2, (2 to max)) } println(sieve(100))
Le résultat est:
List(2)
Autant que je sache, case _ = > cross :: Nil
correspond à la première itération de sieve_core
, ce qui signifie que croisé
n'est pas une instance d'une liste.
J'ai changé le type de paramètre lst
en List [Int]
et maintenant, le code ne sera pas compilé avec une erreur:
(fragment of Problem3.scala):24: error: type mismatch; found : Range.Inclusive required: List[Int] sieve_core(2, (2 to max)) ^
Apparemment, Range
n'est pas une liste
.
Question: comment puis-je transformer Range en liste? Ou est-ce un gros problème avec mon code, j'ai fait une mauvaise hypothèse quelque part en cours de route?
Toute aide appréciée.
La solution
Il existe une méthode apply
sur l'objet compagnon List
qui prend une plage et renvoie une List
:
scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
Il existe de nombreuses méthodes d'usine List
utiles dans la documentation de la collection List
.
Autres conseils
Pour transformer une séquence s
en liste, utilisez s.toList
Je suis sûr que digitalross est plus efficace dans ce cas, cependant.
(2 à max)
n'est pas un scala.collection.immutable.List , mais un scala.collection.immutable.Range , plus précisément une instance de scala.collection.immutable.Range.Inclusive
, comme indiqué dans votre Message d'erreur. En passant, notez que Inclusive
et Exclusif
sont eux-mêmes membres de Range
, avec une signification assez explicite.
Heureusement, la classe Range propose la méthode pratique toList
, que vous pouvez utiliser pour convertir la plage en liste et résoudre le problème, comme dans l'extrait de code suivant:
scala> val max = 10
max: Int = 10
scala> val r = (2 to max)
r: scala.collection.immutable.Range.Inclusive = Range 2 to 10
scala> val l = r.toList
l: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)