Sagen wir, ich habe ein Array[Int]
Like
val array = Array( 1, 2, 3 )
Jetzt möchte ich ein Element an das Array anhängen 4
, beispielsweise den Wert , wie im folgenden Beispiel:
val array2 = array + 4 // will not compile
Ich kann das natürlich System.arraycopy()
alleine benutzen und tun, aber dafür muss es eine Scala-Bibliotheksfunktion geben, die ich einfach nicht finden konnte. Vielen Dank für Hinweise!
Anmerkungen:
Mir ist bewusst, dass ich ein weiteres Array von Elementen anhängen kann, wie in der folgenden Zeile, aber das scheint zu rund:
val array2b = array ++ Array( 4 ) // this works
Ich bin mir der Vor- und Nachteile von List vs Array bewusst und bin aus verschiedenen Gründen speziell an der Erweiterung eines Arrays interessiert.
Bearbeiten 1
Vielen Dank für die Antworten auf die :+
Operatormethode. Das habe ich gesucht. Leider ist es eher langsamer als die Implementierung einer benutzerdefinierten append () -Methode arraycopy
- etwa zwei- bis dreimal langsamer. Wenn Sie sich die Implementierung in ansehen SeqLike[]
, wird ein Builder erstellt, das Array hinzugefügt, das Anhängen über den Builder ausgeführt und der Builder gerendert. Keine gute Implementierung für Arrays. Ich habe einen schnellen Benchmark durchgeführt, bei dem die beiden Methoden verglichen wurden, wobei die schnellste Zeit aus zehn Zyklen betrachtet wurde. Das Ausführen von 10 Millionen Wiederholungen eines einzelnen Elements, das an eine Array-Instanz mit 8 Elementen einer Klasse Foo
angehängt wird, dauert :+
mit einer einfachen append()
Methode 3,1 Sekunden und mit einer einfachen Methode 1,7 SekundenSystem.arraycopy();
Das Ausführen von 10 Millionen Wiederholungen zum Anhängen einzelner Elemente auf 8-Element-Arrays von Long dauert :+
mit der einfachen append()
Methode 2,1 Sekunden und 0,78 Sekunden . Frage mich, ob dies nicht in der Bibliothek mit einer benutzerdefinierten Implementierung für behoben werden konnte Array
?
Bearbeiten 2
Für das, was es wert ist, habe ich ein Ticket eingereicht: https://issues.scala-lang.org/browse/SI-5017
ArrayBuffer
und seine+=
Methode? Dadurch erhalten Sie amortisierte O (1) -Anhänge.System.arraycopy(...)
wird ersetzt durchArray.copy(...)
ArrayBuffer
der nach dem letzten Anhängen an ein Array (mittoArray
) konvertiert wird ?Antworten:
Sie können das
:+
Element an ein Array anhängen und+:
es voranstellen:sollte produzieren:
Es ist das gleiche wie bei jeder anderen Implementierung von
Seq
.quelle
Array.copy(repr, 0, result, 0, repr.length)
Funktioniert auch "umgekehrt":
Es gibt auch eine "In-Place" -Version:
quelle
Das einfachste könnte sein:
Tatsächlich kann Array implizit in a transformiert werden
WrappedArray
quelle