2009-07-18 11 views

回答

99

再一次,似乎我已经不耐烦地回答自己的问题,并在Freenode的#clojure上提问。好东西回答你自己的问题被鼓励在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 
75

如果您已经完成了很多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) 
+0

向量不是seqs,但它们是连续的。 (来源:在freenode的#clojure上让自己富有)另外,我根本不了解Java,但Rich只是回答我的问题。 – Rayne 2009-07-18 17:25:11

+1

我会编辑我的帖子,说矢量可以通过seq函数被_made into_seqs。 :-) – 2009-07-18 17:26:24

+2

选择你的答案是因为它确实回答了这个问题,我真的不喜欢选择我自己的答案是正确的。看起来不正确。谢谢。 :) – Rayne 2009-07-18 17:32:27

34

向量有O(1)个随机存取时间,但它们必须被预先分配。列表可以动态扩展,但访问一个随机元素是O(n)。

12

只是一个快速侧面说明:

"I read that Vectors are not seqs, but Lists are."

序列比任一列表或向量(或地图或套)更通用。
其不幸的是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已返回其参数的快捷方式,如果它已经是一个序列:

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); 
} 

名单序列,但其他的东西为好,而不是所有的序列名单。

24

当使用向量:

  • 索引访问性能 - 你得到〜O(1)用于索引访问对于O(n)的成本清单
  • 追加 - 用连词是〜O( 1)
  • 方便的表示法 - 我发现在任何一种情况下都可以更容易地键入和读取[1 2 3]比'(1 2 3)'更多的文字列表。

当使用列表:当你要访问它作为一个序列(因为列表直接支持序列,而无需分配新对象)

  • 预谋

    • - 增加的开始(1)
  • 相关问题