2

我正在尝试学习clojure。

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

如果我做:

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

typeofitems显示为值如下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是向量,则失败。

那么,如果我可以将其转换为地图,我该如何转换呢?如果没有,我如何在向量中搜索东西?

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

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

4

2 回答 2

3

我怀疑你真正想要的是一套,而不是一张地图。映射存储与特定键关联的值。集合存储一个唯一的值列表。

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

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

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

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

于 2013-04-17T16:17:22.047 回答
2
(apply assoc {} (flatten [["Dogs"] ["Cats"] ["Capybaras"] ["Pygmy Hedgehogs"]]))
;;=> {"Capybaras" "Pygmy Hedgehogs", "Dogs" "Cats"}
于 2013-04-17T16:10:35.927 回答