在Clojure中迭代映射时如何保持顺序?
我有以下地图:在Clojure中迭代映射时如何保持顺序?,clojure,Clojure,我有以下地图: (定义tmp客户数据{:客户 {:一月[10203002000] :二月[01 0 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] :三月[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] :april[1020020020000000000] :may[10203001000] :6月[10200000] :七月[1 0 0 0 0 0 0
(定义tmp客户数据{:客户
{:一月[10203002000]
:二月[01 0 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
:三月[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
:april[1020020020000000000]
:may[10203001000]
:6月[10200000]
:七月[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
:八月[10201000]
:九月[102030400000]
:10月[1020300401000]
:11月[10203004050670000]
:december[120303040501000 00 00 00 00 00 00 00 00 00 00 00 00]})
当我在该地图上执行类似于doseq
的操作时,我注意到顺序没有保留:
(doseq[[k v](:客户tmp客户数据)](println k))
是否有一种适当的方法可以在保持顺序的同时迭代映射?使用映射的有序版本
(def tmp-cust-data {:customers
(flatland.ordered.map/ordered-map
[[:january [1 0 2 0 3 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:february [0 1 0 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:march [0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:april [1 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:may [1 0 2 0 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:june [1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:july [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:august [1 0 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:september [1 0 2 0 3 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:october [1 0 2 0 3 0 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:november [1 0 2 0 3 0 4 0 5 0 6 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:december [1 0 2 0 3 0 4 0 5 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]])})
使用有序版本的地图
(def tmp-cust-data {:customers
(flatland.ordered.map/ordered-map
[[:january [1 0 2 0 3 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:february [0 1 0 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:march [0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:april [1 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:may [1 0 2 0 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:june [1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:july [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:august [1 0 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:september [1 0 2 0 3 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:october [1 0 2 0 3 0 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:november [1 0 2 0 3 0 4 0 5 0 6 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[:december [1 0 2 0 3 0 4 0 5 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]])})
哈希映射本质上是无序的。您可以为键选择顺序,然后可以按顺序迭代这些键并访问哈希映射值,但哈希映射本身不可能有“顺序”。哈希映射本质上是无序的。您可以为键选择顺序,然后可以按顺序迭代这些键并访问哈希映射值,但哈希映射本身不可能有“顺序”。您是否尝试了@nlloyd排序映射?排序映射按其键对其条目进行排序,它不保留插入顺序。有一些库,如
org.flatland/ordered
和frankiesardo/linked
,它们提供的映射实现确实保留了插入顺序。您是否尝试过@nlloyd排序映射按键对其条目进行排序,它不保留插入顺序。有一些库,如org.flatland/ordered
和frankiesardo/linked
,它们提供了映射实现,并保留了插入顺序。当然,关于散列映射,您是对的,但是一个可能适用于受限的用例OP的问题有12个条目——8是当添加更多元素时数组映射将转变为常规哈希映射的阈值,因此,有很多操作可能会在数组映射上执行,从而将其转换为无序的哈希映射,因此这并不是一个好的解决方案。当然,关于哈希映射,您是对的,但是一个可能适用于受限的用例OP的问题有12个条目——8是当添加更多元素时数组映射将转变为常规哈希映射的阈值,因此您可能会对数组映射执行大量操作,将其转变为无序哈希映射,因此这真的不是一个好的解决方案。