如何在Clojure中创建一个空哈希映射?

3

编写代码时,它会给我一个 ArrayMap。

(class (hash-map))

但是在我的代码中,出现了HashMap:

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

问题是:“如何创建一个空的hash-map”?

Clojure认为你应该将非常小的未排序映射保留为数组映射,因此它会为你做出决策。它认为唯一真正不同的是排序映射;所有未排序的映射在你的代码中应该都能正常工作。 - Brian
3个回答

7
另一种可能性是使用预定义的空字段:
user=> (clojure.lang.PersistentHashMap/EMPTY)
{}

在我看来,更好的做法是展示你的意图。


3

您不需要太担心这个问题。运行时会根据情况选择最佳实现方式。PersistentArrayMap适用于少量键值对的情况(即在时间和空间效率上更高),但是一旦键值对数量超过8个,就会升级为PersistentHashMap,请参见相关代码了解详细信息。

*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

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的实例。

如果你真的需要空的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

但是,我不确定这样做是否好或必要。也许你的代码不应该依赖于特定的实现类。


你如何判断 {} 是否是 PersistentArrayMap 的实例? - Abimaran Kugathasan
@KugathasanAbimaran 你可以在REPL中检查上面的代码。(. clojure.lang.PersistentHashMap create {}) 的意思是...使用{}创建PersistentHashMap。 - ntalbs
在访问操作很多的情况下,哈希映射表似乎比数组映射表更有效率。 - Fionser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接