Clojure在不改变顺序的情况下更改地图的值

时间:2014-10-13 07:35:36

标签: map clojure ref

我给出了一张如下所示的地图:

{:foo 121 :yo 85 :good 85 :nice 53 :better 35 :cheaper 26 :price 26 }

我想对地图的价值做一些数学但不改变地图的顺序。 例如,如果我的总计数为400,那么我希望新地图看起来像:

{:foo 121/400 :yo 85/400 :good 85/400 :nice 53/400 :better 35/400 :cheaper 26/400 :price 26/400 }

我可以用reduce来做,但它正在改变地图的顺序。我想我必须使用ref和alter来做这个,但是我正在研究的任何解决方案都失败了。

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您需要使用保持插入顺序的地图,例如ordered

理论上你也可以使用数组映射,但它们会自动提升到哈希映射,如果要操作它们,这将是一个令人头痛的问题。

答案 1 :(得分:1)

当以多态方式在clojure地图上操作时,不能保证元素的顺序将被保留。因此,如果您的收藏不是太大,您可能会使用array-map。但是,在一定数量的插入后,array-map变为hash-map(如果没有更改,则此数字为10)

您也可能喜欢此有序地图实施https://github.com/flatland/ordered