我使用Clojurescript开发webbrowser游戏。 (实际上我的一个朋友教我,我们几个星期才开始)。
我想生成一个映射,其中键是向量,值是数字。例如:{[0 0] 0,[0 1] 1,[0 2] 2,...}。
我使用了这个公式:
(defn oxo [x y]
(zipmap (map vec (combi/cartesian-product (range 0 x) (range 0 y))) (range (* x y))))
(其中combi /指clojure.math.combinatorics)。
当它生成地图时,键值对是可以的,但它们是随机顺序,如:
{[0 1] 1,[6 8] 68,[6 9] 69,[5 7] 57,...}
使用zipmap后出了什么问题,如何解决?
答案 0 :(得分:2)
Clojure地图不保证有订购/排序的密钥。如果您想确保密钥已排序,请使用sorted-map
:
(into (sorted-map) (oxo 10 10))
=>
{[0 0] 0,
[0 1] 1,
[0 2] 2,
[0 3] 3,
[0 4] 4,
[0 5] 5,
...
如果地图的密钥少于9个,则保留插入顺序,因为基础数据结构因密钥数量而异:
clojure.lang.PersistentArrayMap
for< 9 keys clojure.lang.PersistentHashMap
否则。 array-map
生成clojure.lang.PersistentArrayMap
,sorted-map
生成clojure.lang.PersistentTreeMap
。请注意,assoc
到数组地图上可能会生成哈希地图,但assoc
依赖于有序地图仍会生成有序地图。
答案 1 :(得分:0)
zipmap
生成一个哈希映射,其中不保证键的顺序。
如果您需要订购的密钥,可以使用sorted-map
或array-map
。
答案 2 :(得分:0)
据我所知,你不应该依赖Map / Hash / Dictionary来订购任何语言。
如果订单很重要但你不需要O(1)地图的查找性能,那么矢量对矢量对你来说是个不错的选择。
(defn oxo [x y]
(mapv vector (map vec (combi/cartesian-product (range 0 x) (range 0 y))) (range (* x y))))
你会得到这样的东西。
=> (oxo 10 10)
[[[0 0] 0] [[0 1] 1] [[0 2] 2] [[0 3] 3] [[0 4] 4] [[0 5] 5] ...]