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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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,这可以正常工作,但会将新值添加到哈希映射的末尾: (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的另一个版本中,实现可能会发生变化。地图上没有订单保证。