Wann sollte ich Scala's Array anstelle einer der anderen Sammlungen verwenden?

8

Dies ist eher eine Frage des Stils und der Vorliebe, aber hier gilt: Wann sollte ich scala.Array verwenden? Ich benutze List die ganze Zeit und gelegentlich in Seq, Map und dergleichen, aber ich habe nie Array in der Wildnis verwendet oder gesehen. Ist es nur für Java-Kompatibilität da? Fehle ich einen gemeinsamen Anwendungsfall?

    
pr1001 24.11.2009, 21:09
quelle

3 Antworten

12

Zuerst machen wir hier einen Haftungsausschluss. Scala 2.7's Array versucht gleichzeitig eine Java Array und eine Scala Collection zu sein. Es gelingt meistens, aber bei einigen Fällen scheitert es an beiden. Leider können diese Fälle mit guten Leuten mit normalem Code passieren, weshalb Scala 2.8 davon abweicht.

In Scala 2.8 gibt es Array , was Java Array ist. Das bedeutet, dass es sich um einen zusammenhängenden Speicherbereich handelt, der entweder Referenzen oder Grundelemente speichert (und daher unterschiedliche Elementgrößen haben kann) und auf die nach dem Zufallsprinzip schnell zugegriffen werden kann. Es hat auch lausige Methoden, eine schreckliche toString Implementierung, und funktioniert schlecht wenn Generics und Primitive gleichzeitig verwendet werden (zB: def f[T](a: Array[T]) = ...; f(Array(1,2,3)) ).

Und dann gibt es GenericArray , was eine Scala Collection ist, die von einem Array unterstützt wird. Es speichert immer Boxed-Primitive, so dass es keine Performance-Probleme beim Mischen von Primitiven und Generics hat, aber andererseits nicht die Leistungssteigerungen eines rein primitiven (nicht-generischen) Primitivarrays aufweist.

>

Also wann wann was benutzen? Ein Array hat die folgenden Eigenschaften:

  • O (1) zufälliges Lesen und Schreiben
  • O (n) anhängen / vorgeben / einfügen / löschen
  • veränderbar

Wenn Sie keine Generika benötigen oder Ihre Generika als [T <: AnyRef] angegeben werden können, also Primitive ausschließen, die AnyVal sind, und diese Eigenschaften für Ihren Code optimal sind, dann gehen Sie dafür.

Wenn Sie Generics, einschließlich Primitiven, benötigen und diese Eigenschaften für Ihren Code optimal sind, verwenden Sie GenericArray auf Scala 2.8. Wenn Sie eine echte Sammlung mit all ihren Methoden wünschen, können Sie sie auch verwenden, anstatt von impliziten Konvertierungen abhängig zu sein.

Wenn Sie Unveränderbarkeit wünschen oder eine gute Leistung zum Anhängen, Vorbereiten, Einfügen oder Löschen benötigen, suchen Sie nach einer anderen Sammlung.

    
Daniel C. Sobral 24.11.2009, 23:28
quelle
3

Ein Array eignet sich, wenn Sie mehrere Elemente der gleichen (oder kompatiblen) Klasse haben und Sie im Voraus die genaue Anzahl dieser Elemente oder eine vernünftige obere Grenze kennen und an einem schnellen Direktzugriff interessiert sind und vielleicht eine direkte Änderung von Elementen, aber nach dem Einrichten werden Sie niemals Objekte von irgendwo in der Liste einfügen oder entfernen.

Oder anders gesagt, es ist eine aggregierte Datenstruktur mit weniger Schnickschnack als die Collection-Typen, mit etwas weniger Overhead und etwas besserer Leistung, je nachdem, wie sie verwendet wird.

Ein sehr durchdachtes Beispiel: Sie produzieren Funktionen, und Qualitätsprüfungen für diese Funktionen beinhalten die Überprüfung ihrer Leistung oder Ergebnisse für einen Satz von 1000 festen Eingabewerten. Darüber hinaus entscheiden Sie, diese Werte nicht in einer Datei zu belassen, sondern sie in Ihrem Programm fest zu codieren. Ein Array wäre angemessen.

    
Carl Smotricz 24.11.2009 21:15
quelle
3

Die Schnittstelle zu Java-APIs ist ein Fall. Im Gegensatz zu Java-Arrays sind Scala-Arrays invariant und haben daher keinen Vorteil gegenüber Listen.

    
Hemant Kumar 24.11.2009 21:22
quelle