2013-04-17 2 views
2

Я пытаюсь изучить clojure.Convert clojure persistant vector to maps

Я вызываю функцию, которая возвращает мне массив строк ..

Если я:

(let [items (get-all-items)] 
    (println (type items)) 
    (items)) 

type из items показан как class clojure.lang.PersistentVector, где в качестве значения items, как так :

[["Dogs"] ["Cats"] ["Capybaras"] ["Pygmy Hedgehogs"]] 

Я хотел бы преобразовать это карта в формате, как это:

{ "Dogs" "Cats" "Capybaras" "Pygmy Hedgehogs" } 

Имеет ли это значение? Карты Clojure могут содержать список строк справа?

Я только делаю это потому, что если у меня есть это как карту, я могу проверить, если у меня есть домашнее животное в списке, как это:

(contains? pets "Dogs") 
; assuming the map is stored in pets variable 

что терпит неудачу, если pets вектор.

Итак, если я могу преобразовать это в карты, как его преобразовать? если нет, как мне искать что-то в векторе?

(Я люблю работать с картами, так что я предпочел бы иметь карты - если нет веской причины не делать этого)

пса: Я попытался преобразование с into, но это не работает, либо ,

+1

Похоже, вы хотите набор, а не карту. «У собак» есть ценность, отличная от самой себя, или вы просто проверяете членство? –

+0

@FrancisAvila, просто тестирование на членство .. поэтому карты всегда имеют ценность с ними? то наборы будут лучше! – Alexander

ответ

3

Я подозреваю, что вы действительно хотите это набор, не карту. Карты хранят значение, связанное с определенным ключом. Установки хранят уникальный список значений.

Если ваш единственный вариант использования - это тестирование на членство, то вы обязательно хотите установить . Вам нужна карта, если вы также связываете некоторые данные с этим ключом.

Очень легко создать набор из любой последовательности. В вашем случае:

(set (flatten items)) 
;;=> #{"Pygmy Hedgehogs" "Dogs" "Cats" "Capybaras"} 

flatten удаляет вложенности на списки, давая вам последовательность строк. set использует последовательность и возвращает набор уникальных значений в этой последовательности.

+0

Ах, gotcha!Большое спасибо за объяснение, я определенно нуждался в комплекте здесь, спасибо! – Alexander

+2

Noooooo, не сплющи, пожалуйста! Сглаживание никогда не будет правильным ответом на что-либо. Это нормально работает, когда его данные являются просто строками, но это же решение не будет работать вообще, если он хочет, чтобы его набор содержал списки вещей, скажем. Вместо этого используйте 'apply concat' для удаления только одного уровня вложенности:' (set (apply concat items)) '. – amalloy

+0

Отмечено, но я думаю, что в этом случае OP не хочет каких-либо коллекций (кроме строк) в своем наборе. –

2
(apply assoc {} (flatten [["Dogs"] ["Cats"] ["Capybaras"] ["Pygmy Hedgehogs"]])) 
;;=> {"Capybaras" "Pygmy Hedgehogs", "Dogs" "Cats"} 
+0

привет, почему есть запятая после пигмейских ежей? – Alexander

+0

это по-прежнему очень полезно, спасибо – Alexander

+1

Карты (значения ключа). Запятая разделяет пары. Таким образом, ключи на этой карте - «Capybaras» и «Dogs». ('Pygmy Hedgehogs' и' Cats' - их соответствующие значения.) –