ClojureScript zipmap欺骗我或者什么?

时间:2018-02-06 21:12:56

标签: clojure clojurescript

我使用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后出了什么问题,如何解决?

3 个答案:

答案 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个,则保留插入顺序,因为基础数据结构因密钥数量而异:

  1. clojure.lang.PersistentArrayMap for< 9 keys
  2. clojure.lang.PersistentHashMap否则。
  3. array-map生成clojure.lang.PersistentArrayMapsorted-map生成clojure.lang.PersistentTreeMap。请注意,assoc到数组地图上可能会生成哈希地图,但assoc依赖于有序地图仍会生成有序地图。

答案 1 :(得分:0)

zipmap生成一个哈希映射,其中不保证键的顺序。 如果您需要订购的密钥,可以使用sorted-maparray-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] ...]