Ich habe gelesen, dass Vektoren keine Seqs sind, sondern Listen. Ich bin mir nicht sicher, was der Grund dafür ist, einen über den anderen zu verwenden. Es scheint, dass Vektoren am häufigsten verwendet werden, aber gibt es einen Grund dafür?
147
Antworten:
Wieder einmal scheint es, als hätte ich meine eigene Frage beantwortet, indem ich ungeduldig wurde und sie in #clojure auf Freenode gestellt habe. Auf Stackoverflow.com wird empfohlen, Ihre eigenen Fragen zu beantworten: D.
Ich hatte eine kurze Diskussion mit Rich Hickey, und hier ist der Kern davon.
quelle
Wenn Sie viel mit Java programmiert haben und mit dem Java-Sammlungsframework vertraut sind, denken Sie an Listen wie
LinkedList
und Vektoren wieArrayList
. Sie können also Container auf die gleiche Weise auswählen.Zur weiteren Verdeutlichung: Wenn Sie Elemente einzeln einzeln an der Vorder- oder Rückseite der Sequenz hinzufügen möchten, ist eine verknüpfte Liste viel besser als ein Vektor, da die Elemente nicht jedes Mal gemischt werden müssen. Wenn Sie jedoch häufig auf bestimmte Elemente zugreifen möchten (nicht in der Nähe der Vorder- oder Rückseite der Liste) (z. B. Direktzugriff), sollten Sie den Vektor verwenden.
Vektoren können übrigens leicht in Seqs umgewandelt werden.
quelle
ArrayList
implementieren oder ohne sich selbst effektiv neu zu implementierenArrayDeque
.Vektoren haben O (1) zufällige Zugriffszeiten, müssen jedoch vorab zugeordnet werden. Listen können dynamisch erweitert werden, aber der Zugriff auf ein zufälliges Element ist O (n).
quelle
Wann wird ein Vektor verwendet?
Wann man eine Liste verwendet:
quelle
~O(1)
, für diejenigen, für die diese Kostenerklärung hilfreich sein könnte - stackoverflow.com/questions/200384/constant-amortized-timenur eine kurze Randnotiz:
Sequenzen sind allgemeiner als Listen oder Vektoren (oder Karten oder Mengen).
Es ist bedauerlich, dass die REPL Listen und Sequenzen gleich druckt, weil es wirklich so aussieht, als wären Listen Sequenzen, obwohl sie unterschiedlich sind. Die (seq) -Funktion erstellt eine Sequenz aus vielen verschiedenen Dingen, einschließlich Listen, und Sie können diese Sequenz dann jeder der zahlreichen Funktionen zuführen, die mit seqs raffinierte Dinge tun.
Sec hat eine Verknüpfung, die ihr Argument zurückgibt, wenn es bereits eine Sequenz ist:
Listen sind Sequenzen, obwohl es auch andere Dinge sind, und nicht alle Sequenzen sind Listen.
quelle
class
stattclass?
?clojure.lang.PersistentList
mir nicht sicher, ob sich Ihr Beispiel nach Clojure-Updates geändert hat (ich glaube, ich bin auf 1.5), aber beide Beispiele kehren für mich zurück. Ich gehe davon aus, dass duclass
nicht schreiben wolltestclass?
.class
für beide von Ihnen erwähnten Ausdrücke dieselbe PersistentList zurückgegeben wird, bedeutet dies, dass Sequenzen und Listen tatsächlich genau dasselbe sind.