Итерация по хеш-карте Java в Clojure - PullRequest
0 голосов
/ 29 декабря 2018

Я новичок в Clojure и пытаюсь перебрать java-хеш-карту в Clojure.У меня есть следующий простой хэш-карта {message=[hello, world]}.Я пишу следующую программу clojure для ее итерации.

Код 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

Я пытаюсь получить вывод: message hello world

Может кто-нибудь сказать, пожалуйста, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Пожалуйста, попробуйте что-то вроде этого ... функция map может использоваться для итерации коллекции, кроме доз ... map, loop / recur и пользовательская рекурсивная функция с (first, empty?, Rest) также могут использоваться для достижениято же самое.

(def my-map {"message" '("hello" "world")}) 
(map (fn[[k v]] (prn k v))  my-map)
0 голосов
/ 29 декабря 2018

С этим

(doseq [[p q] v]
  (prn p)
  (prn q))

вы выполняете итерацию по списку, присваивая первый элемент каждого элемента p, второй q.Так как у вас есть список строк, вы печатаете первые два символа каждого.

Вы, кажется, хотите:

(doseq [s v]
  (prn s))

Кстати, Clojure использует строчные имена: функциядолжно быть названо print, хотя вы должны попытаться придумать лучшее имя, так как это имя уже существует в ядре Clojure и будет затенено.

...