如何在clojure中创建空哈希映射
当我编码时,它会给我一个数组映射如何在clojure中创建空哈希映射,clojure,Clojure,当我编码时,它会给我一个数组映射 (class (hash-map)) 但当我编写代码时,它会显示一个HashMap: (class (hash-map "" "")) 问题是“如何创建空哈希映射”您可以这样创建空哈希映射: (. clojure.lang.PersistentHashMap create {}) (clojure.lang.PersistentHashMap/create {}) (clojure.lang.PersistentHashMap/EMPTY) 您可以检查哈希
(class (hash-map))
但当我编写代码时,它会显示一个HashMap:
(class (hash-map "" ""))
问题是“如何创建空哈希映射”您可以这样创建空哈希映射:
(. clojure.lang.PersistentHashMap create {})
(clojure.lang.PersistentHashMap/create {})
(clojure.lang.PersistentHashMap/EMPTY)
您可以检查哈希映射的源代码
:
user=> (source hash-map)
(defn hash-map
"keyval => key val
Returns a new hash map with supplied mappings. If any keys are
equal, they are handled as if by repeated uses of assoc."
{:added "1.0"
:static true}
([] {})
([& keyvals]
(. clojure.lang.PersistentHashMap (create keyvals))))
正如您在代码中看到的,如果不提供参数,哈希映射
函数返回{}
,这是PersistentArrayMap
的实例
如果确实需要emptyPersistentHashMap
的实例,可以使用以下代码创建它:
(. clojure.lang.PersistentHashMap create {})
您可以检查已创建实例的类:
user=> (class (. clojure.lang.PersistentHashMap create {}))
clojure.lang.PersistentHashMap
user=> (class (clojure.lang.PersistentHashMap/create {}))
clojure.lang.PersistentHashMap
user=> (class (clojure.lang.PersistentHashMap/EMPTY)) ;; om-nom-nom's : much simpler
clojure.lang.PersistentHashMap
但是,我不确定这样做是好的还是必要的。也许您的代码不应该依赖于特定的实现类。另一种可能是使用预定义的空字段:
user=> (clojure.lang.PersistentHashMap/EMPTY)
{}
在我看来,这更能表明你的意图。你真的不必为此担心。运行时会判断要使用的最佳实现<对于少量的键/值对,代码>PersistentArrayMap是首选(即,它在时间和空间上更有效),但一旦超过8的kv限制,就会升级到
PersistentHashMap
,请参阅
*clojure版本*
{:major 1,:minor 5,:incremental 1,:qualifier nil}
; 用{}和8千伏对声明的映射是ArrayMap
(类型{:A1:B2:C3:D4:E5:F6:G7:H8})
=>clojure.lang.PersistentArrayMap
; 带有9千伏对的{}声明的映射是HashMap
(类型{:A1:B2:C3:D4:E5:F6:G7:H8:I9})
=>clojure.lang.PersistentHashMap
; 将1kV对关联到ArrayMap就是ArrayMap(奇怪的是)
(类型(->{:A1:B2:C3:D4:E5:F6:G7:H8})
(助理:i 9)))
clojure.lang.PersistentArrayMap
; 将2千伏对关联到一个数组映射是一个哈希映射
(类型(->{:A1:B2:C3:D4:E5:F6:G7:H8})
(助理:i 9)
(助理:j 10)))
clojure.lang.PersistentHashMap
如何判断{}
是PersistentArrayMap
的一个实例?@KugathasanAbimaran您可以在REPL中检查上述代码(.clojure.lang.PersistentHashMap create{})
表示。。。使用{}
创建PersistentHashMap。在我看来,当访问操作很多时,hashmap比arraymap效率更高。Clojure认为您应该保留非常小的未排序映射作为数组映射,以便它为您做出决定。它认为真正不同的唯一地图是分类地图;所有未排序的映射在代码中的工作方式应相同。