回答:
繰り返しますが、Freenodeの#clojureで焦って自分の質問に答えたようです。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
ください。したがって、ほとんど同じ方法でコンテナを選択できます。
さらに明確にするために、アイテムをシーケンスの前または後ろに個別にたくさん追加するつもりである場合、アイテムは毎回シャッフルする必要がないので、リンクリストはベクトルよりもはるかに優れています。ただし、特定の要素(リストの前後ではない)に頻繁にアクセスする場合(つまり、ランダムアクセス)、ベクターを使用する必要があります。
ちなみに、ベクトルは簡単にシーケンスに変換できます。
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には、すでにシーケンスである場合に引数を返すショートカットがあります。
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を返すので、これはシーケンスとリストが実際にまったく同じものであることを意味しますか?