답변:
다시 한 번, 나는 참을성이 없어서 Freenode의 #clojure에 질문하여 내 자신의 질문에 대답 한 것 같습니다. 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
. 따라서 컨테이너를 거의 같은 방식으로 선택할 수 있습니다.
더 명확하게 설명하려면 시퀀스의 앞이나 뒤에 개별 항목을 많이 추가하려는 경우 매번 항목을 뒤섞을 필요가 없으므로 연결된 목록이 벡터보다 훨씬 좋습니다. 그러나 특정 요소 (목록의 앞이나 근처가 아닌)에 자주 액세스하려면 (예 : 임의 액세스) 벡터를 사용하는 것이 좋습니다.
그런데 벡터를 쉽게 seq로 바꿀 수 있습니다.
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
자신을 다시 구현하지 않고 deque를 구현할 수 없습니다 .
벡터는 랜덤 액세스 시간이 O (1)이지만 사전 할당되어야합니다. 목록은 동적으로 확장 될 수 있지만 임의의 요소에 액세스하는 것은 O (n)입니다.
벡터를 사용하는 경우 :
목록을 사용하는 경우 :
~O(1)
, 사람들을 위해 누구에게이 비용의 설명이 도움이 될 수 있습니다 - stackoverflow.com/questions/200384/constant-amortized-time
간단한 참고 사항 :
"Vectors는 seqs가 아니지만 Lists는 읽습니다."
시퀀스는 목록 또는 벡터 (또는 맵 또는 세트)보다 일반적입니다.
불행히도 REPL은 목록과 시퀀스를 동일하게 인쇄 한다는 것이 불행합니다 . 왜냐하면 목록이 다르더라도 실제로는 목록처럼 보이기 때문입니다. (seq) 함수는 목록을 포함하여 많은 다른 것들로부터 시퀀스를 만들고, seq를 사용하여 멋진 일을하는 수많은 함수 중 하나에 seq를 공급할 수 있습니다.
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,이 순서와 목록이 실제로 똑같은 것을 의미?