将clojure持久性向量转换为地图

时间:2013-04-17 15:56:52

标签: clojure

我正在努力学习clojure。

我正在调用一个函数,它返回一个字符串数组..

如果我这样做:

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

type的{​​{1}}显示为items,其中class clojure.lang.PersistentVector值如此:

items

我想将此格式转换为地图,格式如下:

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

这有意义吗? Clojure地图可以包含字符串列表吗?

我只是这样做,因为如果我将它作为地图,我可以检查列表中是否有像这样的宠物:

{ "Dogs" "Cats" "Capybaras" "Pygmy Hedgehogs" }
如果(contains? pets "Dogs") ; assuming the map is stored in pets variable 是向量,则

失败。

所以,如果我可以将其转换为地图,我该如何转换它?如果没有,我如何在矢量中搜索某些内容?

(我喜欢使用地图,所以我宁愿有地图 - 除非有充分的理由不这样做)

ps:我尝试使用into转换,但这也不起作用。

2 个答案:

答案 0 :(得分:3)

我怀疑你真正想要的是,而不是地图。地图存储与特定密钥关联的值。设置存储唯一的值列表。

如果您的唯一用例是测试成员资格,那么您肯定需要。如果您还要将某些数据与该密钥相关联,则需要地图。

从任何序列生成集合非常容易。在你的情况下:

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

flatten删除列表中的嵌套,为您提供一系列字符串。 set使用序列并返回该序列中的一组唯一值。

答案 1 :(得分:2)

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