繁体   English   中英

在Clojure中迭代Java哈希图

[英]Iterating over a java hashmap in Clojure

我是Clojure的新手,正在尝试遍历Clojure中的Java哈希表。 我有以下简单的哈希图{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

有人可以告诉我我在做什么错吗?

有了这个

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

您正在遍历一个列表,将每个元素的第一个元素分配给p ,第二个元素分配给q 由于那里有一个字符串列表,因此您将打印每个字符串的前两个字符。

您似乎想要:

(doseq [s v]
  (prn s))

顺便说一句,Clojure使用小写字母名称:该函数应命名为print ,尽管您应该尝试使用更好的名称,因为该名称已经存在于Clojure核心中并且会被遮盖。

请尝试类似这样的操作...除了剂量之外,map函数还可以用于迭代集合... map,循环/递归和用户定义的递归函数(首先,为空?,其余)也可以用来实现相同目的。

(def my-map {"message" '("hello" "world")}) 
(map (fn[[k v]] (prn k v))  my-map)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM