Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中迭代映射时如何保持顺序?_Clojure - Fatal编程技术网

在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是当添加更多元素时数组映射将转变为常规哈希映射的阈值,因此您可能会对数组映射执行大量操作,将其转变为无序哈希映射,因此这真的不是一个好的解决方案。