我读矢量不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);
}

列出序列,虽然其他的事情是,并不是所有的序列的清单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top