3

コーディングするとArrayMapが得られます

(class (hash-map))

しかし、コーディングすると HashMap が出てきます:

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

質問は「空のハッシュマップを作成するにはどうすればよいですか?」

4

3 に答える 3

7

もう 1 つの可能性は、定義済みの 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 に答える