3

当我编码时,它给了我一个 ArrayMap

(class (hash-map))

但是当我编码时它会出现一个 HashMap:

(class (hash-map "" ""))

问题是“如何创建一个空的哈希映射”?

4

3 回答 3

7

另一种可能性是使用预定义的 EMPTY 字段:

user=> (clojure.lang.PersistentHashMap/EMPTY)
{}

在我看来,最好显示你的意图。

于 2013-03-28T10:03:26.247 回答
3

您可以像这样创建空的哈希映射:

(. clojure.lang.PersistentHashMap create {})
(clojure.lang.PersistentHashMap/create {})
(clojure.lang.PersistentHashMap/EMPTY)

您可以查看源代码hash-map

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))))

正如您在代码中看到的,如果您不提供参数,则hash-map函数返回{},即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

但是,我不确定这样做是好是坏。也许您的代码不应该依赖于特定的实现类。

于 2013-03-28T09:28:19.437 回答
2

你真的不需要担心这个。运行时会判断要使用的最佳实现。PersistentArrayMap对于少数键/值对来说是首选(即在时间和空间上更有效),但是PersistentHashMap一旦超过 8 的 kv 限制就会升级,有关详细信息,请参阅相关代码

*clojure-version*
{:major 1, :minor 5, :incremental 1, :qualifier nil}

; map declared with {} with 8 kv pairs is ArrayMap
(type {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8})
  => clojure.lang.PersistentArrayMap

; map declared with {} with 9 kv pairs is HashMap
(type {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9})
  => clojure.lang.PersistentHashMap

; assoc'ing 1 kv pairs into an ArrayMap is an ArrayMap (oddly)
(type (-> {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8} 
          (assoc :i 9)))
clojure.lang.PersistentArrayMap

; assoc'ing 2 kv pairs into an ArrayMap is an HashMap
(type (-> {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8} 
          (assoc :i 9) 
          (assoc :j 10)))
clojure.lang.PersistentHashMap
于 2013-03-28T14:15:30.653 回答