Відповіді:
Ще раз, здається, я відповів на власне запитання, нетерплячи і задавши його в #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
. Таким чином, ви можете майже вибрати контейнери таким же чином.
Для подальшого уточнення: якщо ви збираєтесь додавати елементи окремо на передню або задню частину послідовності багато, пов'язаний список набагато краще, ніж вектор, тому що елементи не потрібно переміщувати навколо кожного разу. Однак якщо ви хочете часто потрапляти на конкретні елементи (не поруч із передньою чи задньою частинами списку) (тобто випадковий доступ), вам потрібно буде використовувати вектор.
До речі, вектори можна легко перетворити на сліди.
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) створить послідовність з безлічі різних речей, включаючи списки, і ви зможете подавати цю послідовність в будь-яку з безлічі функцій, які роблять вишукані речі з допомогою послідовностей.
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 для обох цих виразів, які ви згадали, це означає, що послідовності та списки - це саме те саме?