Эти два могут показаться похожими, но в действительности они очень разные.
zipmap
создает карту (map vector ...)
создает LazySeq
n-кортежей (векторовразмером n)
Это две очень разные структуры данных.Хотя ленивая последовательность из двух кортежей может показаться похожей на карту, они ведут себя очень по-разному.
Скажем, мы отображаем две коллекции, coll1
и coll2
.Рассмотрим случай, когда у coll1
есть повторяющиеся элементы.Вывод zipmap
будет содержать только значение, соответствующее последнему появлению дубликатов ключей в coll1
.Вывод (map vector ...)
будет содержать 2 кортежа со всеми значениями дубликатов ключей.
Простой пример REPL:
=> (zipmap [:k1 :k2 :k3 :k1] [1 2 3 4])
{:k3 3, :k2 2, :k1 4}
=>(map vector [:k1 :k2 :k3 :k1] [1 2 3 4])
([:k1 1] [:k2 2] [:k3 3] [:k1 4])
Учитывая это, увидеть тривиальноОпасность в предположении следующего:
Но в основном - помимо порядка получающихся пар - эти два метода эквивалентны, потому что seq'd map становится последовательностью векторов.
Карта seq'd становится последовательностью векторов, но не обязательно той же последовательностью векторов, что и результаты из (map vector ...)
Для полноты, вот отсортированные seq'd векторов:
=> (sort (seq (zipmap [:k1 :k2 :k3 :k1] [1 2 3 4])))
([:k1 4] [:k2 2] [:k3 3])
=> (sort (seq (map vector [:k1 :k2 :k3 :k1] [1 2 3 4])))
([:k1 1] [:k1 4] [:k2 2] [:k3 3])
Я думаю, что самое близкое, что мы можем получить к утверждению, подобному приведенному выше:
set
результата (zip map coll1 coll2)
будет равно set
результат (map vector coll1 coll2)
, если coll1
сам по себе set
.
Это много квалификаторов для двух операций, которые предположительно очень похожи.Вот почему особое внимание должно быть уделено при принятии решения, какой из них использовать.Они очень разные, служат разным целям и не должны использоваться взаимозаменяемо.