Es gibt verschiedene Möglichkeiten, eine unveränderliche Liste in Scala zu erstellen (siehe Beispielcode unten). Sie können einen veränderlichen ListBuffer verwenden, eine var
Liste erstellen und ändern, eine rekursive Schwanzmethode verwenden und wahrscheinlich andere, die ich nicht kenne.
Instinktiv verwende ich den ListBuffer, aber ich habe keinen guten Grund dafür. Gibt es eine bevorzugte oder idiomatische Methode zum Erstellen einer Liste oder gibt es Situationen, die für eine Methode gegenüber einer anderen am besten geeignet sind?
import scala.collection.mutable.ListBuffer
// THESE are all the same as: 0 to 3 toList.
def listTestA() ={
var list:List[Int] = Nil
for(i <- 0 to 3)
list = list ::: List(i)
list
}
def listTestB() ={
val list = new ListBuffer[Int]()
for (i <- 0 to 3)
list += i
list.toList
}
def listTestC() ={
def _add(l:List[Int], i:Int):List[Int] = i match {
case 3 => l ::: List(3)
case _ => _add(l ::: List(i), i +1)
}
_add(Nil, 0)
}
What you DON'T do is use a List and append to it
Liegt das daran, dass eine neue Liste erstellt wird? Während bei Verwendung einer Voranstelloperation keine neue Liste erstellt wird?Nil
. Zweitens gibt es beim Voranstellen keinerlei Kopie: Es wird ein Element erstellt, das auf die vorhandene Liste verweist, und das war's.Und für einfache Fälle:
:) :)
quelle
Ähm ... diese scheinen mir zu komplex. Darf ich vorschlagen
oder
quelle
Sie möchten sich generell auf die Unveränderlichkeit in Scala konzentrieren, indem Sie alle Vars entfernen. Die Lesbarkeit ist für Ihren Mitmenschen immer noch wichtig.
Versuchen:
In den meisten Fällen müssen Sie wahrscheinlich nicht einmal in eine Liste konvertieren :)
Die indizierte Sequenz enthält alles, was Sie benötigen:
Das heißt, Sie können jetzt an diesem IndexedSeq arbeiten:
quelle
Vector
ist jetzt auch die StandardimplementierungSeq
.Ich bevorzuge immer List und verwende "Fold / Reduce" vor "zum Verständnis". "Zum Verständnis" wird jedoch bevorzugt, wenn verschachtelte "Falten" erforderlich sind. Rekursion ist der letzte Ausweg, wenn ich die Aufgabe mit "Fold / Reduce / For" nicht ausführen kann.
Für Ihr Beispiel werde ich Folgendes tun:
bevor ich es tue:
Hinweis: Ich verwende hier "foldRight (: \)" anstelle von "foldLeft (/ :)" wegen der Reihenfolge von "_". Verwenden Sie für eine Version, die keine StackOverflowException auslöst, stattdessen "foldLeft".
quelle
((0 to 3) :\ List[Int]())(_ :: _)
Emoticode zu nennen ?Verwenden Sie
List.tabulate
wie folgt:quelle
Hinweis: Diese Antwort wurde für eine alte Version von Scala geschrieben.
Die Scala-Sammlungsklassen werden ab Scala 2.8 neu gestaltet. Seien Sie also bereit, die Art und Weise, wie Sie Listen erstellen, sehr bald zu ändern.
Was ist die vorwärtskompatible Methode zum Erstellen einer Liste? Ich habe keine Ahnung, da ich die 2.8-Dokumente noch nicht gelesen habe.
Ein PDF-Dokument, das die vorgeschlagenen Änderungen der Sammlungsklassen beschreibt
quelle
Als neuer Scala-Entwickler habe ich einen kleinen Test geschrieben, um die Erstellungszeit der Liste mit den oben vorgeschlagenen Methoden zu überprüfen. Es sieht so aus (für (p <- (0 bis x)) ergibt p), um den schnellsten Ansatz aufzulisten.
quelle
Nur ein Beispiel, das collection.breakOut verwendet
quelle
Verwenden Sie Folgendes, um eine Liste mit Zeichenfolgen zu erstellen:
quelle