【问题标题】:Using Java hashmaps in Clojure在 Clojure 中使用 Java 哈希图
【发布时间】:2019-01-05 19:04:15
【问题描述】:

我是 Clojure 的新手。我正在尝试在 clojure 中使用 java hashmap。我正在将一个 java hashmap 传递给 Clojure。地图是 - {0=果阿,1=德里,2=孟买}。当我尝试在此地图上使用 clojure 函数时,我没有得到预期的输出。与此相反,当我在此地图上进行迭代时,它给出了预期的输出。

Example
   (println(get map 0)) is giving nil




(doseq [[key value] map
      (println value)) is giving the expected output.

        Output-Goa
               Delhi
               Mumbai

谁能解释一下为什么会这样?

【问题讨论】:

  • 请注意您如何标记您的问题。鉴于您的问题与 java 无关,因此吸引 Java 专家回答您的问题对您没有帮助。

标签: clojure clojure-java-interop


【解决方案1】:

你真的应该用谷歌搜索一下像这样的预先存在的答案:Clojure: working with a java.util.HashMap in an idiomatic Clojure fashion

然后你可以看到一个简单的答案:

(def data {:a 1 :b 2 :c 3})

(def java-map (java.util.HashMap. data))
(def clj-map  (into {} java-map))

这给了我们:

java-map  => <#java.util.HashMap {:b 2, :c 3, :a 1}>
clj-map   => <#clojure.lang.PersistentArrayMap {:b 2, :c 3, :a 1}>

和循环:

  (doseq [[k v] clj-map]
    (println (format "key=%s  val=%s" k v)) )

结果:

key=:b  val=2
key=:c  val=3
key=:a  val=1

【讨论】:

    【解决方案2】:

    我认为您的问题是您的地图被命名为“地图”,这也是一个 Clojure 函数。试试这样:

    (def my-map {0 "Goa" 1 "Delhi" 2 "Mumbai"})
    

    然后会像这样工作:

    (println (get my-map 0))
    

    请注意,它仍然返回 nil,因为 (println) 表单之后没有其他内容,但它确实打印了地图中 0 的值,即“Goa”。

    【讨论】:

    • 虽然您确实不应该使用 map 作为地图的名称,但如果您在 REPL 上尝试它,您应该只会收到类似 WARNING: map already refers to: #'clojure.core/map in namespace: user, being replaced by: #'user/map 的警告。如果您随后天真地尝试使用正常的 Clojure map 函数,则会导致奇怪的行为,但不会导致此处描述的特定问题。
    • @BenSchmidt 感谢您的澄清。我并不完全清楚他的“地图”来自哪里,因为原始问题中缺少那部分代码。
    【解决方案3】:
    (def input-map {0 "Goa" 1 "Delhi" 2 "Mumbai"})
    
    (map (fn[[k v]] (print "key " k " value " k)) input-map) 
    

    [[k v]] for function 让您访问每个条目的键和值

    (map print input-map)
    

    这里的地图条目将作为参数传递给打印

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2016-07-09
      • 1970-01-01
      • 2022-12-10
      相关资源
      最近更新 更多