ฉันอ่านแล้วว่า Vectors ไม่ใช่ seqs แต่ Lists คือ ฉันไม่แน่ใจว่าเหตุผลสำหรับการใช้อย่างใดอย่างหนึ่งมากกว่าที่อื่น ดูเหมือนว่าเวกเตอร์จะถูกใช้มากที่สุด แต่มีเหตุผลสำหรับสิ่งนั้นหรือไม่?
ฉันอ่านแล้วว่า Vectors ไม่ใช่ seqs แต่ Lists คือ ฉันไม่แน่ใจว่าเหตุผลสำหรับการใช้อย่างใดอย่างหนึ่งมากกว่าที่อื่น ดูเหมือนว่าเวกเตอร์จะถูกใช้มากที่สุด แต่มีเหตุผลสำหรับสิ่งนั้นหรือไม่?
คำตอบ:
ดูเหมือนว่าฉันจะตอบคำถามของฉันเองด้วยการใจร้อนและถามใน #clojure บน Freenode สิ่งที่ดีในการตอบคำถามของคุณได้รับการสนับสนุนบน Stackoverflow.com: D
ฉันได้พูดคุยอย่างรวดเร็วกับ Rich Hickey และนี่คือส่วนสำคัญของมัน
[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 มากและมีความคุ้นเคยกับกรอบคอลเลกชัน Java คิดของรายการเช่นและพาหะเช่นLinkedList
ArrayList
ดังนั้นคุณสามารถเลือกคอนเทนเนอร์ได้เหมือนกัน
สำหรับการชี้แจงเพิ่มเติม: หากคุณต้องการเพิ่มรายการทีละรายการที่ด้านหน้าหรือด้านหลังของลำดับจำนวนมากรายการที่ลิงก์จะดีกว่าเวกเตอร์เนื่องจากรายการไม่จำเป็นต้องสลับกันในแต่ละครั้ง อย่างไรก็ตามหากคุณต้องการเข้าถึงองค์ประกอบเฉพาะ (ไม่ใกล้ด้านหน้าหรือด้านหลังของรายการ) บ่อยครั้ง (เช่นการเข้าถึงแบบสุ่ม) คุณจะต้องใช้เวกเตอร์
โดยวิธีการที่เวกเตอร์สามารถกลายเป็น seqs ได้อย่างง่ายดาย
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
เพียงแค่ทราบอย่างรวดเร็ว:
"ฉันอ่านแล้วเวกเตอร์ไม่ใช่คำถาม แต่เป็นรายการ"
ลำดับมีทั่วไปมากกว่ารายการหรือเวกเตอร์ (หรือแผนที่หรือชุด)
น่าเสียดายที่REPL พิมพ์รายการและลำดับเดียวกันเพราะทำให้ดูเหมือนว่ารายการต่าง ๆ เป็นลำดับแม้ว่ามันจะแตกต่างกัน ฟังก์ชั่น (seq) จะสร้างลำดับจากสิ่งต่าง ๆ มากมายรวมถึงรายการและจากนั้นคุณสามารถป้อน seq นั้นให้กับฟังก์ชั่นมากมายที่ทำสิ่งที่ดีด้วย seqs
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 เดียวกันสำหรับนิพจน์ทั้งสองที่คุณกล่าวถึงนี้หมายความว่าลำดับและรายการเป็นสิ่งเดียวกันแน่นอนใช่ไหม