जवाबों:
एक बार फिर, ऐसा लगता है कि मैंने अपने सवाल का जवाब अधीर होकर और फ्रीनोडे पर # क्लोजर में पूछकर दिया है। अपने स्वयं के सवालों का जवाब देने वाली अच्छी बात Stackoverflow.com: D पर प्रोत्साहित की जाती है
मैंने रिच हिकी के साथ एक त्वरित चर्चा की, और यहाँ इसका सार है।
[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
यदि आपने जावा प्रोग्रामिंग बहुत कर ली है, और जावा संग्रह ढांचे से परिचित हैं LinkedList
, तो जैसे सूचियों के बारे में सोचें , और वैक्टर पसंद करें ArrayList
। तो आप बहुत ज्यादा उसी तरह कंटेनरों का चयन कर सकते हैं।
आगे के स्पष्टीकरण के लिए: यदि आप व्यक्तिगत रूप से आइटम को आगे या पीछे के क्रम में जोड़ना चाहते हैं, तो एक लिंक की गई सूची वेक्टर की तुलना में बहुत बेहतर है, क्योंकि आइटम को हर बार फेरबदल करने की आवश्यकता नहीं होती है। हालांकि, यदि आप विशिष्ट तत्वों (सूची के सामने या पीछे के पास नहीं) में अक्सर (यानी, यादृच्छिक पहुंच) प्राप्त करना चाहते हैं, तो आप वेक्टर का उपयोग करना चाहेंगे।
वैसे, वैक्टर आसानी से seq में बदल सकते हैं।
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
बिना, प्रभावी ढंग से, ArrayDeque
अपने आप को कार्यान्वित करते हुए एक डीके को लागू नहीं कर सकते ।
वैक्टरों में O (1) यादृच्छिक अभिगम समय है, लेकिन उन्हें प्रचार करना होगा। सूचियों को गतिशील रूप से बढ़ाया जा सकता है, लेकिन एक यादृच्छिक तत्व तक पहुंच O (n) है।
वेक्टर का उपयोग कब करें:
सूची का उपयोग कब करें:
~O(1)
उन लोगों के लिए, जिनके लिए यह लागत स्पष्टीकरण मददगार हो सकता है - stackoverflow.com/questions/200384/constant-amortized-time
बस एक त्वरित पक्ष नोट:
"मैंने पढ़ा है कि वैक्टर seqs नहीं हैं, लेकिन सूचियाँ हैं।"
अनुक्रम सूची या वैक्टर (या नक्शे या सेट) की तुलना में अधिक सामान्य हैं।
इसका दुर्भाग्यपूर्ण है कि आरईपीएल सूची और अनुक्रमों को एक ही करता है क्योंकि यह वास्तव में बनाता है कि यह सूची के अनुक्रमों की तरह दिखते हैं भले ही वे अलग हों। (seq) फ़ंक्शन, सूचियों सहित कई अलग-अलग चीज़ों से एक अनुक्रम बना देगा, और फिर आप उस seq को किसी भी फ़ंक्शंस के फ़ीड में फीड कर सकते हैं जो seq के साथ निफ्टी चीजें करते हैं।
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 का एक शॉर्टकट है जो अपना तर्क देता है यदि वह पहले से ही seq है:
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);
}
सूचियां अनुक्रम हैं, हालांकि अन्य चीजें भी हैं, और सभी अनुक्रम सूची नहीं हैं।
class
इसके बजाय मतलब नहीं है class?
?
clojure.lang.PersistentList
मेरे लिए वापस आते हैं । मैं मान रहा हूं कि आप लिखने के लिए class
नहीं थे class?
।
class
आपके द्वारा बताए गए इन दोनों ही भावों के लिए समान PersistentList देता है, इसका मतलब है कि अनुक्रम और सूचियां वास्तव में एक ही बात हैं?