【发布时间】:2025-12-09 05:45:01
【问题描述】:
如果我有这样的数组映射:
{"red" "blue"}
我怎样才能把它变成这样的数组:
["red" "blue"]
【问题讨论】:
-
“数组”应该是“向量”。
标签: arrays dictionary vector clojure data-conversion
如果我有这样的数组映射:
{"red" "blue"}
我怎样才能把它变成这样的数组:
["red" "blue"]
【问题讨论】:
标签: arrays dictionary vector clojure data-conversion
地图包含一组无序的 MapEntry 对象,它们的作用类似于向量,因此只需先在地图上调用即可将其转换为序列,然后获取第一个地图条目:
(first {"red" "blue"})
; ["red" "blue"]
【讨论】:
(vec (mapcat seq {"red" "blue"}))
; ["red" "blue"]
【讨论】:
user> (vec (apply concat {:a 0 :b 1 :c 2 :d 3}))
[:c 2 :b 1 :d 3 :a 0]
这和 Thumbnail 的方案类似,但是调用 seq 是多余的。
还假设您的意思是向量而不是数组。如果输出只是线性的就足够了,那么也可以消除对 vec 的调用。
flatten 选项的问题是地图中是否存在任何类型的内部结构:
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)
【讨论】:
如果要将空映射作为空向量处理,将多对映射作为[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 [] {})
[]
【讨论】:
一种非常快速的方法:
(flatten (vec {"red" "blue"}))
=> ("red" "blue")
如果你真的想要一个数组:
(into-array (flatten (vec {"red" "blue"})))
=> #<String[] [Ljava.lang.String;@4dc2753>
请记住,在 Clojure 中,["red" "blue"] 是一个向量,而不是一个数组。 { } 表示地图。 Clojure 首先创建一个数组映射,然后在必要时将其提升为哈希映射。
【讨论】:
vec而不是seq?它正在做一堆对结果没有任何作用的工作(散列,构建一棵树)。另外flatten 几乎从来都不是正确的选择。