Vektörlerin ardışık değil, Listeler olduğunu okudum. Birini diğerine tercih etmenin mantığının ne olduğundan emin değilim. Görünüşe göre vektörler en çok kullanılıyor, ancak bunun bir nedeni var mı?
Yanıtlar:
Bir kez daha, sabırsızlanarak ve Freenode'daki #clojure'da sorarak kendi sorumu yanıtlamış gibi görünüyor. Stackoverflow.com'da kendi sorularınızı yanıtlamanız teşvik edilir: D
Rich Hickey ile hızlı bir tartışma yaptım ve işte işin özü.
[12:21] <Raynes> Vectors aren't seqs, right?
[12:21] <rhickey> Raynes: no, but they are sequential
[12:21] <rhickey> ,(sequential? [1 2 3])
[12:21] <clojurebot> true
[12:22] <Raynes> When would you want to use a list over a vector?
[12:22] <rhickey> when generating code, when generating back-to-front
[12:23] <rhickey> not too often in Clojure
Java programlamayı çok yaptıysanız ve Java toplama çerçevesine aşina iseniz, gibi listeler LinkedList
ve ArrayList
. Yani neredeyse aynı şekilde kapları seçebilirsiniz.
Daha fazla açıklama için: Öğeleri tek tek dizinin önüne veya arkasına çok fazla eklemeyi düşünüyorsanız, bağlantılı bir liste vektörden çok daha iyidir çünkü öğelerin her seferinde karıştırılmasına gerek yoktur. Ancak, belirli öğelere (listenin önüne veya arkasına yakın değil) sık sık (yani rastgele erişim) ulaşmak istiyorsanız, vektörü kullanmak isteyeceksiniz.
Bu arada, vektörler kolayca sıralı hale getirilebilir.
user=> (def v (vector 1 2 3))
#'user/v
user=> v
[1 2 3]
user=> (seq v)
(1 2 3)
user=> (rseq v)
(3 2 1)
ArrayList
etkili bir şekilde yeniden uygulayamazsınız ArrayDeque
.
Vektörlerin O (1) rastgele erişim süreleri vardır, ancak önceden tahsis edilmeleri gerekir. Listeler dinamik olarak genişletilebilir, ancak rastgele bir öğeye erişim O (n) 'dur.
Bir vektör ne zaman kullanılır:
Liste ne zaman kullanılır:
~O(1)
, bu maliyet açıklamasının yardımcı olabileceği kişiler için - stackoverflow.com/questions/200384/constant-amortized-time
kısa bir yan not:
"Vektörlerin sıralı olmadığını, Listelerin olduğunu okudum."
diziler, listelerden veya vektörlerden (veya haritalardan veya kümelerden) daha geneldir. REPL'in listeleri ve dizileri aynı şekilde yazdırması
talihsiz bir durumdur çünkü gerçekten farklı olsalar bile listelerin dizilermiş gibi görünmesini sağlar. (seq) işlevi, listeler de dahil olmak üzere birçok farklı şeyden bir dizi oluşturur ve daha sonra bu diziyi, sıra ile şık şeyler yapan çok sayıda işlevden herhangi birine besleyebilirsiniz.
user> (class (list 1 2 3))
clojure.lang.PersistentList
user> (class (seq (list 1 2 3)))
clojure.lang.PersistentList
user> (class (seq [1 2 3]))
clojure.lang.PersistentVector$ChunkedSeq
Sec, zaten bir seq ise argümanını döndüren bir kısayol içerir:
user> (let [alist (list 1 2 3)] (identical? alist (seq alist)))
true
user> (identical? (list 1 2 3) (seq (list 1 2 3)))
false
static public ISeq seq(Object coll){
if(coll instanceof ASeq)
return (ASeq) coll;
else if(coll instanceof LazySeq)
return ((LazySeq) coll).seq();
else
return seqFrom(coll);
}
listeler dizilerdir, ancak diğer şeyler de vardır ve tüm diziler liste değildir.
class
yerine mi demek istiyorsun class?
?
clojure.lang.PersistentList
benim için geri dönüyor . Sana yazmak istedim tahmin ediyorum class
değil class?
.
class
getiri Bahsettiğiniz bu ifadelerin ikisi için de aynı PersistentList, bu diziler ve listeler aslında aynı şey olduğunu ima?