首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在clojure中创建一个空的散列映射

如何在clojure中创建一个空的散列映射
EN

Stack Overflow用户
提问于 2013-03-28 17:23:50
回答 3查看 2.4K关注 0票数 3

在我编码时,它会给我一个ArrayMap

代码语言:javascript
复制
(class (hash-map))

但当我编写代码时,它会显示出一个HashMap:

代码语言:javascript
复制
(class (hash-map "" ""))

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-28 17:28:19

您可以像这样创建空的散列映射:

代码语言:javascript
复制
(. clojure.lang.PersistentHashMap create {})
(clojure.lang.PersistentHashMap/create {})
(clojure.lang.PersistentHashMap/EMPTY)

您可以查看hash-map的源代码

代码语言:javascript
复制
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的实例,可以使用以下代码进行创建:

代码语言:javascript
复制
(. clojure.lang.PersistentHashMap create {})

您可以查看创建的实例所属的类:

代码语言:javascript
复制
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

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

票数 3
EN

Stack Overflow用户

发布于 2013-03-28 18:03:26

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

代码语言:javascript
复制
user=> (clojure.lang.PersistentHashMap/EMPTY)
{}

在我看来,这更好地表明了你的意图。

票数 7
EN

Stack Overflow用户

发布于 2013-03-28 22:15:31

你真的不需要担心这个。运行库对要使用的最佳实现进行判断。最好使用PersistentArrayMap (即对于少量的键/值对,它在时间和空间上更有效),但一旦超过8的kv限制,就会升级到PersistentHashMap,请参阅the relevant code for details

代码语言:javascript
复制
*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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15678150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档