在题,当时我应该采用一个向量在一个列表,和周围的其他方式?
题
我读矢量不seqs,但名单。我不知道是什么的理由是对于使用一个。它似乎向量是使用最多的,但是有一个原因是什么?
解决方案
再一次,看来我已经等得不耐烦了,并要求其在#clojure Freenode上回答了我自己的问题。在回答自己的问题好处是鼓励在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
其他提示
如果你做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)
载体具有O(1)随机访问时间,但是它们必须被预先分配。列表可以被动态地扩展,但是接入随机元件为O(n)。
当使用矢量:
- 索引入的性能-你得到-O(1)费用索引的访问与O(n)对于清单
- 追加-与连是-O(1)
- 方便的符号-我找到它既容易类型和阅读[1 2 3]于'(1 2 3)对于一个文本列表的情况下,要么将工作。
当使用一个清单:
- 当你想要访问它作为一个序列(从列出了直接支持seq而不必分配新的对象)
- 加上加以开始的一清单与弊或优选连是O(1)
只是一个快速的侧注意:
"I read that Vectors are not seqs, but Lists are."
序列更多的通用比列表,或矢量(或地图集)。
它的不幸, REPL打印名单和顺序相同 因为它真的让它看起来像列出序列,即使它们是不同的。的(序)功能将进行一系列自很多不同的东西,包括列出了,然后你可以料,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
仲有一个快捷方式返回其参数,如果这已经是一个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);
}
列出序列,虽然其他的事情是,并不是所有的序列的清单。
不隶属于 StackOverflow