将clojure数组映射转换为数组

时间:2014-04-05 12:50:10

标签: arrays dictionary vector clojure data-conversion

如果我有这样的数组映射:

{"red" "blue"}

如何将其转换为如下数组:

["red" "blue"]

5 个答案:

答案 0 :(得分:8)

地图包含一组无序的MapEntry对象,它们就像向量一样,所以只需先在地图上调用就会将其转换为序列,然后抓取第一个地图条目:

(first {"red" "blue"})
; ["red" "blue"]

答案 1 :(得分:1)

(vec (mapcat seq {"red" "blue"}))
; ["red" "blue"]

答案 2 :(得分:1)

user> (vec (apply concat {:a 0 :b 1 :c 2 :d 3}))
[:c 2 :b 1 :d 3 :a 0]

这与Thumbnail的解决方案类似,但调用seq是多余的。

还假设你的意思是矢量而不是数组。如果输出只是线性就足够了,那么也可以消除对vec的调用。

展平选项的问题在于地图中是否存在任何类型的内部结构:

user> (flatten (seq {:a 0 :b 1 :c [2 3]}))
(:c 2 3 :b 1 :a 0)
user> (apply concat {:a 0 :b 1 :c [2 3]})
(:c [2 3] :b 1 :a 0)

答案 3 :(得分:1)

如果您想将空地图作为空矢量处理,将多个地图作为[key val key val...]的矢量处理,那么您可以使用reduce into []reduce-kv conj []

so.core=> (reduce into [] {"red" "blue"})
["red" "blue"]
so.core=> (reduce into [] {:a 0 :b 1 :c 2 :d 3})
[:c 2 :b 1 :d 3 :a 0]
so.core=> (reduce into [] {})
[]

答案 4 :(得分:0)

一种非常快捷的方法:

(flatten (vec {"red" "blue"}))

=> ("red" "blue")

如果你真的想要一个数组:

 (into-array (flatten (vec {"red" "blue"})))

 => #<String[] [Ljava.lang.String;@4dc2753>

请记住,在Clojure中,[&#34; red&#34; &#34; blue&#34;]是一个向量,而不是一个数组。 {}表示地图。 Clojure首先创建一个数组映射,但稍后,它会在必要时将其提升为哈希映射。