Legen Sie ein Element in den Schwanz einer Sammlung
Ich finde mich dabei eine Menge:
(concat coll [e])
wo coll ist eine Sammlung, und e ein element.
Gibt es eine Funktion, für die dies in Clojure? Ich weiß, conj macht den job am besten für Vektoren, aber ich weiß nicht bis vor die coll verwendet. Es könnte sein, einen Vektor, eine Liste oder sortiert- - set zum Beispiel.
InformationsquelleAutor der Frage Michiel Borkent | 2011-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Arten von Sammlungen hinzufügen können, kostengünstig an der Vorderseite (Listen, seq), während andere hinzufügen können, kostengünstig an der Rückseite (Vektoren, queues, kinda-sorta faul-seqs). Anstatt concat, wenn möglich gestalten Sie die Zusammenarbeit mit einem dieser Typen (vector wird am häufigsten) und nur conj:
(conj [1 2 3] 4)
Erträge[1 2 3 4]
während(conj '(1 2 3) 4)
Erträge(4 1 2 3)
.InformationsquelleAutor der Antwort amalloy
concat nicht ein element auf den Schwanz der Sammlung, noch macht Sie verketten zwei Sammlungen.
concat gibt eine seq aus der Verkettung von zwei anderen seqs. Die ursprüngliche Art der Sammlungen, aus denen seqs abgeleitet werden kann, sind verloren für den Rückgabetyp von concat.
Nun, clojure-collections unterschiedliche Eigenschaften haben, muss man wissen, um zu schreiben, effizienten code, das ist, warum gibt es nicht eine Universelle Funktion zur Verfügung im Kern zu verketten von Sammlungen aller Art zusammen.
Im Gegenteil, Listen und Vektoren zu tun haben "Natürliche insertion Positionen", die conj weiß, und tut, was Recht ist, für die Art der Sammlung.
InformationsquelleAutor der Antwort Laurent Petit
Dies ist ein sehr kleiner Nachtrag zu @amalloy Antwort, um OP ' s Wunsch für eine Funktion, die fügt immer sich an den Schwanz gleich welcher Art Sammlung. Dies ist eine alternative zu
(concat coll [x])
. Erstellen Sie einfach eine Vektor-version des original-Sammlung:Vorsichtsmaßnahmen:
Wenn Sie sich begann mit einer lazy sequence, hast du jetzt zerstört, der Faulheit,--D. H. der Ausgang ist nicht faul. Dies kann entweder eine gute oder eine schlechte Sache je nach Ihren Bedürfnissen.
Gibt es einige Kosten für die Erstellung der Vektorgrafiken. Wenn Sie brauchen, um diese Funktion aufrufen zu viel, und Sie finden (z.B. durch benchmarking mit Kriterium), dass diese Kosten bedeutend ist für deine Zwecke, dann Folgen die anderen Antworten, Ratschläge, um zu versuchen, um die Verwendung von Vektoren in den ersten Platz.
InformationsquelleAutor der Antwort Mars
Daraus das beste, was amalloy und Laurent Petit bereits sagte: verwenden Sie die
conj
Funktion.Einer der großen Abstraktionen, Clojure bietet, ist die Sequenz-API, die auch die
conj
Funktion. Wenn möglich, sollte Ihr code werden als Auflistung vom Typ Agnostiker, wie es sein kann, stattdessen mit der seq-API zu behandeln Operationen auf Kollektionen und der Auswahl einer bestimmten Kollektion geben Sie nur, wenn Sie brauchen, um genau zu sein.Wenn Vektoren sind ein gutes Spiel-ja, dann
conj
wird das hinzufügen von Elementen an das Ende. Wenn verwenden Sie Listen statt, dannconj
hinzufügen werden Dinge, die vor Ihrer Sammlung. Aber wenn Sie dann noch die standard-seq-API-Funktionen für das ziehen von Elementen aus der "top" - einer Sammlung (die Rückseite eines Vektors, der vor einer Liste), ist es egal, welche Implementierung Sie verwenden, denn es wird immer die beste Leistung und somit das hinzufügen und entfernen von Elementen konsistent.InformationsquelleAutor der Antwort semperos