Итерация по хеш-карте Java в Clojure
Я новичок в Clojure и пытаюсь перебрать java-хэш-карту в Clojure. У меня есть следующий простой hashmap {message=[hello, world]}
, Я пишу следующую программу clojure, чтобы перебрать ее.
Код закрытия:
(defn Print [m]
(doseq [[k v] m]
(prn k)
(doseq [[p q] v]
(prn p)
(prn q))))
Java-код:
package com.example;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import clojure.java.api.Clojure;
import clojure.lang.IFn;
class Main {
public static void main(String[] args) {
IFn require = Clojure.var("clojure.core", "require");
require.invoke(Clojure.read("com.example.core"));
IFn Print = Clojure.var("com.example.core", "Print");
List<String> list = new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
list.add("hello");
list.add("world");
map.put("message", list);
Print.invoke(map);
}
}
Вывод, который я получаю:
"message"
\h
\e
\w
\o
Я пытаюсь получить вывод: сообщение Привет, мир
Может кто-нибудь сказать, пожалуйста, что я делаю не так?
2 ответа
С этим
(doseq [[p q] v]
(prn p)
(prn q))
вы перебираете список, присваивая первый элемент каждого элемента p
второй q
, Поскольку у вас есть список строк, вы печатаете первые два символа каждого.
Вы, кажется, хотите:
(doseq [s v]
(prn s))
Кстати, Clojure использует строчные имена: функция должна быть названа print
, хотя вы должны попытаться придумать лучшее имя, так как это имя уже существует в ядре Clojure и будет затенено.
Пожалуйста, попробуйте что-то вроде этого... функция map может использоваться для итерации коллекции, кроме доз... map, loop/recur и определенная пользователем рекурсивная функция с (first, empty?, Rest) также могут использоваться для достижения того же самого.
(def my-map {"message" '("hello" "world")})
(map (fn[[k v]] (prn k v)) my-map)