So erstellen Liste von Bereich
Frage
Ich bin neu in Scala, gerade erst begonnen zu lernen, so ist dies grundlegende Anfänger Frage.
Ich versuche Sieb des Eratosthenes Algorithmus zu implementieren. Hier ist, was ich habe, so weit:
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))
Das Ergebnis ist:
List(2)
Soweit ich verstehe, case _ => cross :: Nil
in der ersten Iteration von sieve_core
abgestimmt ist, was bedeutet, dass crossed
nicht eine Instanz einer Liste ist.
Ich änderte lst
Parameter Typen List[Int]
und jetzt wird der Code mit einem Fehler nicht kompilieren:
(fragment of Problem3.scala):24: error: type mismatch; found : Range.Inclusive required: List[Int] sieve_core(2, (2 to max)) ^
Offenbar Range
ist kein List
.
Frage: Wie kann ich Bereich in eine Liste machen? Oder ist es etwas größeres Problem mit meinem Code, habe ich habe einige schlechte Annahme, irgendwo auf dem Weg?
Jede Hilfe sehr geschätzt.
Lösung
Es gibt eine apply
Methode auf dem List
Begleiter Objekt, das eine Reihe nimmt und gibt einen List
:
scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
Es gibt viele nützliche List
Factory-Methoden in der List
Sammlung Dokumentation .
Andere Tipps
So schalten Sie eine beliebige Folge s
in eine Liste, die Verwendung s.toList
Ich bin sicher, digitalross' effiziente in diesem Fall ist, wenn.
(2 to max)
ist kein scala.collection .immutable.List in der Tat aber ein scala.collection.immutable.Range , genauer gesagt eine Instanz von scala.collection.immutable.Range.Inclusive
, wie in der Fehlermeldung erwähnt. Nur in Kenntnis beiläufig, dass Inclusive
und Exclusive
ist selbst Mitglieder von Range
, mit einer ziemlich Autoerklärend Bedeutung.
Zum Glück ist die Range-Klasse bietet die praktische Methode toList
, die Sie zum Umwandeln des Bereichs in eine Liste nutzen können, und lösen Sie das Problem, wie im folgenden Code-Snippet:
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)