Wie zu verwenden ListBuffer in scala?
Habe ich eine situation, wo ich bin vorbei ein einzelnes element der Liste um eine Methode. Innerhalb dieser Methode, das einzelne element in der Liste um eins erhöht. So, dass nach Aufruf der Methode wird die Liste zum ersten element wird modifiziert ( um eins erhöht).
Code ist wie folgt:
val ct = List(5)
someMethod(ct)
println (ct(0))
//should print 6
......
//within somethod, I incrment the element like:
def someMethod(ct: List[Int}) {
ct(0) = ct(0) + 1
}
Natürlich obige code funktioniert nicht in der Scala. Ich schaute auf ListBuffer aber ich finde die scala doc schwer zu Folgen. Scala doc ist in 2 Gruppen unterteilt: Typ Mitglieder und Wert Mitglieder. In Typ Mitglied es ist Klasse WithFiler und Wert Mitglieder hat viele Methoden. Wie kann ich WithFiler ( wahrscheinlich nicht direkt mit dieser Frage, aber ich möchte verstehen, wie zu nutzen, von scala doc).
ListBuffer zu sein scheint, die richtige Lösung für dieses problem, wenn ich will, sehr hohe Leistung haben (die someMethod genannt wird millionenfach) ( korrigiert mich wenn ich falsch Liege).
So, wie lösen Sie obiges problem, wenn ListBuffer ist die richtige Art von Liste und wenn nicht, was ist die Lösung?
- Das sind zwei verschiedene Fragen, wirklich-eine in Bezug auf die Verwendung
ListBuffer
, und die anderen im Zusammenhang zu verstehen, Scaladoc Typ Mitglieder und Wert Mitglieder. Bitte Fragen Sie die letztere Frage separat.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der scala, der Ausdruck:
ist umgeschrieben als:
Methode
update
ist nicht definiert für SupertypList
da Listen werden kann, unveränderlich. Allerdings, das ist der Typ der Funktion argument.So müssen Sie nur ListBuffers (oder eine veränderliche obertyp):
Durch die Art und Weise, wenn Sie brauchen, um Zugriff auf Elemente durch Indizes, verwenden Sie stattdessen eine
ArrayBuffer
. Es sollte funktionieren, da javaArrayList
.Schließlich, Wenn Sie nicht brauchen, um darüber nachzudenken
WithFilter
Zeug. Verwenden Sie einfach diefilter
Methode.Wenn die Leistung ist eine der wichtigsten Ziel-und maximale Größe der Sammlung ist bekannt, Sie können Arrays verwendet werden, die Karten direkt zu java-Arrays.
Dies hat den Geruch einer vorzeitigen Mikro-Optimierung über es.
Zwar gibt es triftige Gründe für die Verwendung von Veränderlichkeit (einschließlich Optimierung), Sie haben nicht erklärt, warum Sie glauben, dass Ihre Nutzung gültig ist, oder das größere problem, das Sie versuchen zu lösen. Insbesondere, unveränderlich Listen sind sehr effizient, wenn unter den Schwanz und voranstellen von einem neuen head - 100% der nicht-Kopf-Elemente werden gemeinsam zwischen der ursprünglichen und der neuen Liste.
Wie dargestellt, ist die sauberste Lösung für Ihre Anforderungen ist, zu vergessen
ListBuffer
- stick mit einer unveränderlichenList
und implementierensomeMethod
ohne Rückgriff auf Nebenwirkungen.Auf der anderen Seite, wenn diese ist ein performance-hotspot, und Sie können nicht sehen, jede Möglichkeit zur Verbesserung der Leistung durch die änderung des Algorithmus, dann werden Sie wollen verwenden Sie eine
Array
Array ist nur vergegenständlicht collection-Typ auf der JVM. Als solcher, können Sie direkt die Arbeit mit den primitiven in ein Array und vermeiden Sie das boxing/unboxing, die anderen collection-Typen haben zu kämpfen.
Den Vorteil, hier hat nichts zu tun mit der Wandelbarkeit vs. unwandelbarkeit; die Leistung Kosten unboxing/boxing ist weit höher, als die Leistung Kosten (wenn überhaupt) mit einer unveränderlichen Liste.
Kann man sicherlich umschreiben die oben genannten zu verwenden
ListBuffer
, aber wenn alle Sie wollen, ist call-by-reference Semantik für eine einzelneInt
es ist nicht unbedingt die effizienteste Lösung.ArrayBuffer
sollte etwas besser sein. Man könnte auch etwas wie das hier tun:Ich in der Regel versuchen, zu umschreiben, meinen code zu vermeiden, mit mutable collections für diese Art der Sache. Zum Beispiel, Sie könnten nur der neue Wert wird zurückgegeben:
Wenn Sie verwenden möchten ListBuffer, alles, was Sie zu tun haben ist, ersetzt das Wort "Liste" im code für "ListBuffer". Ich würde allerdings vermeiden die Seite-Effekt-Funktion (Ihre someMethod: Unit) komplett wie naten schlägt.
ListBuffer hat "high performance" - aber der Hauptzweck ist das hinzufügen von Elementen/änderung der Auflistung. Wenn ich es richtig, Sie einfach aktualisieren Sie das Element in ein Element Kollektion million mal - Array ist ausreichend für die.