2013-03-28 68 views
3

它给了我一个ArrayMap,因为我的代码如何创建Clojure中的一个空的哈希地图

(class (hash-map)) 

但它出来一个HashMap当我代码:

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

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

+0

Clojure的认为你应该将非常小的未排序地图保存为数组地图,以便为您做出决定。它认为真正不同的唯一地图是分类地图;所有未分类的地图都应该在你的代码中工作。 – Brian 2013-05-11 02:48:51

回答

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 

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

+0

你怎么知道'{}'是'PersistentArrayMap'的一个实例? – 2013-03-28 10:02:13

+0

@KugathasanAbimaran你可以在REPL中检查上面的代码。 '(。clojure.lang.PersistentHashMap create {})'意味着...使用'{}'创建PersistentHashMap。 – ntalbs 2013-03-28 10:06:29

+0

在我看来,当访问操作很多时,hashmap比arraymap有效。 – Fionser 2013-03-28 10:22:11

6

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

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

在我看来,这是更好地显示你的意图。

+0

谢谢你的回答!我是一个新人,我编辑了这个意图...... – Fionser 2013-03-28 10:20:08

2

你不应该为此担心。运行时对使用的最佳实现做出判断。 PersistentArrayMap优先(即它在时间和空间上更有效)的小数字键/值对的,但推广到PersistentHashMap发生一次8 kv的极限被超越,看到the relevant code for details

*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