我是Clojure的新手,我正在尝试遍历Clojure中的Java哈希表。
我有以下简单的哈希图{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
我正在尝试获取输出: 消息你好世界
有人可以告诉我我在做什么错吗?
答案 0 :(得分:0)
有了这个
(doseq [[p q] v]
(prn p)
(prn q))
您正在遍历一个列表,将每个元素的第一个元素分配给p
,第二个元素分配给q
。由于那里有一个字符串列表,因此您将打印每个字符串的前两个字符。
您似乎想要:
(doseq [s v]
(prn s))
顺便说一下,Clojure使用小写字母名称:该函数应命名为print
,尽管您应该尝试使用一个更好的名称,因为该名称已经存在于Clojure内核中并且会被遮盖。 / p>
答案 1 :(得分:0)
请尝试类似这样的操作... map函数可用于迭代集合 除了剂量...映射,循环/递归和用户定义的(第一个,空的?,其余的)递归函数也可以用来实现相同的目的。
(def my-map {"message" '("hello" "world")})
(map (fn[[k v]] (prn k v)) my-map)