2016-04-18 12 views
4

Ich konfrontiert ein Problem, wo ich einen neuen Wert in der Mitte eines Array hinzufügen musste (d. H. Eine Kopie des ursprünglichen Arrays und ersetzen Sie diese durch die neue). Ich habe mein Problem erfolgreich gelöst, aber ich habe mich gefragt, ob es andere Methoden gibt, dies zu tun, ohne das Array für eine Weile zu puffern.Hinzufügen von Wert zu Arrays in Scala

val original = Array(0, 1, 3, 4) 
val parts = original.splitAt(2) 
val modified = parts._1 ++ (2 +: parts._2) 

res0: Array[Int] = Array(0, 1, 2, 3, 4) 

Was ich nicht auf meine Lösung gefällt ist die parts Variable; Ich würde es vorziehen, keinen Zwischenschritt wie diesen zu verwenden. Ist das der einfachste Weg, den Wert hinzuzufügen, oder gibt es bessere Möglichkeiten, ein Element hinzuzufügen?

+0

[Dies] (http://stackoverflow.com/questions/4675222/scala-insert-into-list-at-specific-locations) ist eine schöne Lösung für die Verwendung einer 'List'. –

Antwort

8

Das ist genau das, was patch tut:

val original = Array(0, 1, 3, 4) 
original.patch(2, Array(2), 0)  // Array[Int] = Array(0, 1, 2, 3, 4) 
+0

Vielen Dank !!! ! – Duzzz

1

Nun, wenn in der Tat die zusätzliche Variable ist, was Sie bedrückt, Sie können es in einem Rutsch tun:

val modified = original.take(2) ++ (2 +: original.drop(2)) 

Aber mit einer wandelbaren Sammlung wie Augusto könnte besser vorgeschlagen passen, auf die je nach Anwendungsfall (zB Leistung, Array-Größe, mehrere solcher Bearbeitungen ...).

1

Die Frage ist, was ist der Kontext? Wenn Sie dies in einer Schleife tun, wird jedes Mal, wenn Sie jedes Mal ein neues Array zuweisen, Ihre Leistung zunichte gemacht. Sie sollten Ihre Vorgehensweise überdenken (z. B. alle Elemente, die Sie einfügen möchten, bevor Sie sie einfügen).

Wenn Sie nicht, na ja, Sie System.arraycopy verwenden können keine Zwischenkonvertierungen zu vermeiden:

val original = Array(0, 1, 3, 4) 
val index = 2 
val valueToInsert = 2 

val modified = Array.ofDim[Int](original.length + 1) 
System.arraycopy(original, 0, modified, 0, index) 
modified(index) = valueToInsert 
System.arraycopy(original, index, modified, index + 1, original.length - index) 

Aber beachten Sie, wie einfach es ist hier ein Off-by-one Fehler zu machen (Ich denke, es isn‘ t eins, aber ich habe es nicht getestet). Der einzige Grund dafür ist, wenn Sie wirklich hohe Leistung benötigen, und das ist nur wahrscheinlich, wenn es in einer Schleife passiert, in diesem Fall gehen Sie zurück zum zweiten Satz.

Verwandte Themen