Fügen Sie ein neues element an einer bestimmten position einer Liste
Gibt es keine built-in Funktion oder eine Methode von einer Liste, die es erlauben würde Benutzer hinzufügen ein neues element an einer bestimmten position einer Liste. Hab ich schrieb eine Funktion, die dies tut, aber ich bin mir nicht sicher, dass es eine gute Idee, es zu tun auf diese Weise, obwohl es funktioniert sehr gut:
def insert(list: List[Any], i: Int, value: Any) = {
list.take(i) ++ List(value) ++ list.drop(i)
}
Verwendung:
scala> insert(List(1,2,3,5), 3, 4)
res62: List[Any] = List(1, 2, 3, 4, 5)
- Keine Antwort, aber ich würde vorschlagen, mit
.splitAt
eher als.take
und.drop
(zu vermeiden, gehen über die Liste zweimal). - Dies wäre wahrscheinlich viel mehr den entsprechenden CodeReview.SE. Ich werde die Antwort in den Geist dieser Website.
- "Es gibt keine built-in Funktion oder eine Methode von einer Liste, die würde, die Benutzer erlauben, um ein neues element hinzuzufügen" Aber es ist so eine Methode - es ist genannt
patch
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Art Sicherheit
Das krasseste, was ich sehe, ist das fehlen von Sicherheit, Verlust von Informationen. Ich würde die Methode allgemein in der Liste element-Typ:
Stil
Wenn der Körper nur aus einem einzigen Ausdruck, es gibt keine Notwendigkeit, die geschweiften Klammern:
Effizienz
@Marth's Kommentar über die Verwendung
Liste.splitAt
zu vermeiden, Durchlaufen der Liste doppelt ist auch gut:Schnittstelle
Wäre es wahrscheinlich bequem einfügen zu können, mehr als einen Wert gleichzeitig:
- Schnittstelle, 2
Den man machen kann diese Erweiterung Methode der
List
:Schlussbemerkungen
Beachten Sie jedoch, dass beim einfügen in der Mitte der Liste ist einfach nicht eine gute Passform für eine cons-Liste. Sie wäre viel besser dran, mit einer (änderbaren) verkettete Listen oder dynamische Arrays statt.
front ++ List(values:_*) ++ back
mitfront ++ values ++ back
.ListWithInsert
extends AnyVal
?Können Sie auch
xs.patch(i, ys, r)
ersetztr
Elementexs
abi
durch den patchys
durch die Verwendungr=0
und durchys
singleton:In die Scala natürlich durch seine Eminenz Martin Odersky selbst, setzt er, ähnlich wie
Einer traversal-bei den meisten.