首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ClojureScript zipmap骗我还是什么?

ClojureScript zipmap骗我还是什么?
EN

Stack Overflow用户
提问于 2018-02-06 21:12:56
回答 3查看 294关注 0票数 0

我使用Clojurescript开发网络浏览器-游戏。(事实上,我的一个朋友教我,我们几周前才开始工作)。

我想要生成一个地图,其中键是向量,值是数字。例如:{0 0 0,0 1 1,0 2 2,…}。

我用了这个公式:

代码语言:javascript
运行
复制
 (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后出了什么问题,我如何修复它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-06 21:23:25

Clojure映射不能保证有命令/排序的密钥。如果要确保对密钥进行排序,请使用sorted-map

代码语言:javascript
运行
复制
(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. <9键的clojure.lang.PersistentArrayMap
  2. 否则是clojure.lang.PersistentHashMap

array-map生成clojure.lang.PersistentArrayMapsorted-map生成clojure.lang.PersistentTreeMap。注意,数组映射上的assoc可以生成散列映射,但是继续到排序映射的assoc仍然会生成排序映射。

票数 2
EN

Stack Overflow用户

发布于 2018-02-06 21:28:02

zipmap生成一个不保证键顺序的散列映射。如果您想要有序的密钥,可以使用sorted-maparray-map

票数 0
EN

Stack Overflow用户

发布于 2018-02-07 00:44:44

据我所知,您不应该依赖Map/Hash/Dictionary在任何语言中排序。

如果顺序很重要,但不需要映射的O(1)查找性能,那么向量对的向量是一个很好的选择。

代码语言:javascript
运行
复制
(defn oxo [x y]
  (mapv vector (map vec (combi/cartesian-product (range 0 x) (range 0 y))) (range (* x y))))

你会得到这样的东西。

代码语言:javascript
运行
复制
=> (oxo 10 10)
[[[0 0] 0] [[0 1] 1] [[0 2] 2] [[0 3] 3] [[0 4] 4] [[0 5] 5] ...]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48652038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档