Clojure:如何在交换中连接到哈希映射的前面!功能
这可以正常工作,但会将新值添加到哈希映射的末尾:Clojure:如何在交换中连接到哈希映射的前面!功能,clojure,Clojure,这可以正常工作,但会将新值添加到哈希映射的末尾: (swap!my atom conj@new fields) 我需要my atom成为@new fields中的第一项。我尝试了assoc in,cons以及几乎所有可能“把事情组合在一起”的东西。如何进行交换到@新字段的前面?散列图是无序集合;从逻辑上讲,它们没有“开始”或“结束”。它们有一个迭代顺序,这是一个实现细节(基于键的散列),用户不应该依赖它。该迭代顺序将在相同映射的读数之间保持一致,因为映射是一个不可变的值 听起来您需要不同的数据类
(swap!my atom conj@new fields)
我需要
my atom
成为@new fields中的第一项。我尝试了assoc in
,cons
以及几乎所有可能“把事情组合在一起”的东西。如何进行交换myatom
中的code>到@新字段的前面
?散列图是无序集合;从逻辑上讲,它们没有“开始”或“结束”。它们有一个迭代顺序,这是一个实现细节(基于键的散列),用户不应该依赖它。该迭代顺序将在相同映射的读数之间保持一致,因为映射是一个不可变的值
听起来您需要不同的数据类型,以提供可预测的排序。排序后的地图是最容易替换的。您可以使用创建它们(使用键上的compare
进行排序),或使用sortedmap by
(使用比较器函数比较键)conj
如果根据比较器,新密钥最低,则将一个密钥-值对合并为一个将把它放在第一位。
请注意,这些仍然是逻辑映射:如果比较器说两个键彼此相等,那么它们是相同的键,结果映射将只有一个值
如果您不能使其满足您的需求,那么听起来您实际上并没有使用逻辑映射,因为这些值同时具有索引和键。如果您真的需要手动设置顺序,有几个备选方案可能是
- 具有单个键/值对的
[key-value]
元组或映射的向量李>
- 带有组合键的映射
[索引旧键]
,按索引
排序,其中旧键
是您现在使用的任何键李>
散列图是无序的,因此没有“结束”这样的东西。数据在渲染时始终以相同的顺序出现(cljs),而conj
-ing始终将新atom
值放在末尾,所以我明白你的意思,这并不排除原子可以作为哈希映射中的第一个值添加的可能性。至少我希望不是。键只保留少量项目的插入顺序。一旦超过某个尺寸(也许是8号?),订单就会发生很大变化。但您甚至不能依赖于此,因为在Clojure的另一个版本中,实现可能会发生变化。地图上没有订单保证。