উত্তর:
আবারও, মনে হচ্ছে আমি অধৈর্য হয়ে নিজের প্রশ্নটির জবাব দিয়েছি এবং ফ্রেইনোডে # ক্লোজারে এটি জিজ্ঞাসা করেছি। আপনার নিজের প্রশ্নের উত্তর দেওয়ার ভাল জিনিস স্ট্যাকওভারফ্লো.কম এ উত্সাহিত হয়েছে: ডি
আমি রিচ হিকির সাথে একটি দ্রুত আলোচনা করেছি, এবং এটির সংক্ষেপে এখানে রয়েছে।
[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
। সুতরাং আপনি একইভাবে পাত্রগুলি চয়ন করতে পারেন।
আরও স্পষ্টতার জন্য: আপনি যদি ক্রমটির সামনের অংশ বা সামনের অংশে স্বতন্ত্রভাবে আইটেম যুক্ত করতে চান, তবে কোনও লিঙ্কযুক্ত তালিকাটি একটি ভেক্টরের চেয়ে অনেক ভাল, কারণ আইটেমগুলিকে প্রতিটি সময় বদলে দেওয়ার প্রয়োজন হয় না। তবে, আপনি যদি নির্দিষ্ট উপাদানগুলিতে (তালিকার সামনে বা পিছনের নিকটে নয়) পেতে চান (তবে, এলোমেলো অ্যাক্সেস), আপনি ভেক্টর ব্যবহার করতে চাইবেন।
যাইহোক, ভেক্টরগুলি সহজেই সেকস-এ পরিণত হতে পারে।
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
নিজেকে পুনরায় সংশোধন করে কোনও ডেকিকে প্রয়োগ করতে পারবেন না ।
ভেক্টরগুলির ও (1) এলোমেলো অ্যাক্সেসের সময় রয়েছে তবে সেগুলি পূর্বনির্ধারিত হতে হবে। তালিকাগুলি ডায়নামিকভাবে বাড়ানো যেতে পারে তবে এলোমেলো উপাদান অ্যাক্সেস করা ও (এন)।
কখন ভেক্টর ব্যবহার করবেন:
একটি তালিকা কখন ব্যবহার করবেন:
~O(1)
, যাঁদের জন্য এই ব্যয়ের ব্যাখ্যাটি সহায়ক হতে পারে - স্ট্যাকওভারফ্লো
শুধু একটি দ্রুত পাশ নোট:
"আমি পড়েছি ভেক্টরগুলি সেকস নয়, তবে তালিকাগুলি রয়েছে।"
তালিকা বা ভেক্টর (বা মানচিত্র বা সেট) এর চেয়ে ক্রমগুলি আরও জেনেরিক।
এটি দুর্ভাগ্যজনক যে REPL টি তালিকা এবং সিকোয়েন্সগুলি একই প্রিন্ট করে কারণ এটি সত্যই এটি দেখতে দেখায় যে তালিকাগুলি পৃথক হলেও সিকোয়েন্স। (সিক) ফাংশন তালিকাগুলি সহ বিভিন্ন ধরণের জিনিসগুলির একটি ক্রম তৈরি করবে এবং আপনি সেই সেকটিকে ফাংশনগুলির যে কোনও আধিক্যকে সিকস দিয়ে নিফটি জিনিসগুলি করতে পারেন।
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
সেকের একটি শর্টকাট রয়েছে যা এটি ইতিমধ্যে একটি সিক হলে তার যুক্তিটি ফিরিয়ে দেয়:
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
আপনি উল্লিখিত এই উভয় এক্সপ্রেশনটির জন্য একই পার্সেন্টিস্টলিস্টটি ফেরত দেয়, এটি বোঝাচ্ছে যে ক্রম এবং তালিকাগুলি প্রকৃতপক্ষে ঠিক একই জিনিস?