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,当我编码时,它会给我一个数组映射 (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
的实例

如果确实需要empty
PersistentHashMap
的实例,可以使用以下代码创建它:

(. 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认为您应该保留非常小的未排序映射作为数组映射,以便它为您做出决定。它认为真正不同的唯一地图是分类地图;所有未排序的映射在代码中的工作方式应相同。