我使用Clojurescript开发网络浏览器-游戏。(事实上,我的一个朋友教我,我们几周前才开始工作)。
我想要生成一个地图,其中键是向量,值是数字。例如:{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))))
(其中组合词/指clojure.math.combinatorics)。
当它生成映射时,键值对是可以的,但是它们的顺序是随机的,例如:
{0 1,6 8 68,6 9 69,5 7 57,.}
使用zipmap后出了什么问题,我如何修复它?
发布于 2018-02-06 21:23:25
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
clojure.lang.PersistentHashMap
。array-map
生成clojure.lang.PersistentArrayMap
,sorted-map
生成clojure.lang.PersistentTreeMap
。注意,数组映射上的assoc
可以生成散列映射,但是继续到排序映射的assoc
仍然会生成排序映射。
发布于 2018-02-06 21:28:02
zipmap
生成一个不保证键顺序的散列映射。如果您想要有序的密钥,可以使用sorted-map
或array-map
。
发布于 2018-02-07 00:44:44
据我所知,您不应该依赖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] ...]
https://stackoverflow.com/questions/48652038
复制相似问题