Использование хэш-карт Java в Clojure

Я новичок в Clojure. Я пытаюсь использовать java-хэш-карту в clojure. Я передаю хэш-карту Java в 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

Может кто-нибудь объяснить мне, почему это происходит?


person ditri    schedule 05.01.2019    source источник
comment
Пожалуйста, помните о том, как вы помечаете свои вопросы. Учитывая, что ваш вопрос не касается java, привлечение экспертов по Java к вашему вопросу вам не поможет.   -  person Joe C    schedule 05.01.2019


Ответы (3)


Вам действительно нужно немного погуглить, чтобы найти уже существующие ответы, подобные этому: Clojure: работа с java.util.HashMap в стиле Clojure

Затем вы можете увидеть простой ответ:

(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
person Alan Thompson    schedule 05.01.2019

Я думаю, ваша проблема в том, что ваша карта называется «карта», которая также является функцией Clojure. Попробуйте это так:

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

Что тогда будет работать так:

(println (get my-map 0))

Обратите внимание, что он по-прежнему возвращает nil, поскольку после формы (println) нет ничего другого, но он печатает значение 0 на карте, то есть «Гоа».

person jwh20    schedule 05.01.2019
comment
Хотя это правда, что вы не должны использовать map в качестве имени вашей карты, если вы попробуете это на REPL, вы должны просто получить предупреждение вроде WARNING: map already refers to: #'clojure.core/map in namespace: user, being replaced by: #'user/map. Это приведет к странному поведению, если вы затем наивно попытаетесь использовать обычную функцию Clojure map, но не вызовет конкретной проблемы, описанной здесь. - person Ben Schmidt; 05.01.2019
comment
@BenSchmidt Спасибо за разъяснение. Мне не совсем понятно, откуда взялась его карта, поскольку эта часть кода отсутствует в исходном вопросе. - person jwh20; 05.01.2019

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

(map (fn[[k v]] (print "key " k " value " k)) input-map) 

[[k v]] для функции позволяет получить доступ к ключу и значению для каждой записи

(map print input-map)

здесь запись карты будет передана как параметр для печати

person Narendra Pinnaka    schedule 06.01.2019