2013-03-28 62 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