Come creare un elenco da intervallo
Domanda
Sono nuovo di Scala, ho appena iniziato a studiare, quindi questa è una domanda di base per principianti.
Cerco di implementare l'algoritmo Sieve of Eratosthenes . Ecco cosa ho ottenuto finora:
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))
Il risultato è:
List(2)
Per quanto ho capito, case _ = > cross :: Nil
viene associato nella prima iterazione di sieve_core
, il che significa che cross
non è un'istanza di un Elenco.
Ho cambiato il tipo di parametri lst
in Elenco [Int]
e ora il codice non verrà compilato con un errore:
(fragment of Problem3.scala):24: error: type mismatch; found : Range.Inclusive required: List[Int] sieve_core(2, (2 to max)) ^
Apparentemente Range
non è un List
.
Domanda: come posso trasformare Range in un Elenco? O è un problema più grande con il mio codice, ho fatto qualche brutta ipotesi da qualche parte lungo la strada?
Qualsiasi aiuto apprezzato.
Soluzione
Esiste un metodo apply
sull'oggetto associato List
che accetta un intervallo e restituisce un List
:
scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
Esistono molti List
metodi di fabbrica utili nella List
documentazione sulla raccolta .
Altri suggerimenti
Per trasformare qualsiasi sequenza s
in un elenco, usa s.toList
Sono sicuro che digitalross 'sia più efficiente in questo caso, tuttavia.
(da 2 a max)
non è un scala.collection.immutable.List in effetti, ma un scala.collection.immutable.Range , più precisamente un'istanza di scala.collection.immutable.Range.Inclusive
, come menzionato nel tuo messaggio di errore. Solo di sfuggita notate che Inclusive
e Exclusive
sono essi stessi membri di Range
, con un significato abbastanza autoesplicativo.
Fortunatamente la classe Range offre il pratico metodo toList
, che puoi sfruttare per convertire l'intervallo in un elenco e risolvere il problema, come nel seguente frammento di codice:
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)