【问题标题】:Iterating over a java hashmap in Clojure在 Clojure 中迭代 java hashmap
【发布时间】:2018-12-29 09:25:59
【问题描述】:

我是 Clojure 的新手,我正在尝试在 Clojure 中迭代 java hashmap。 我有以下简单的哈希图{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

我正在尝试获取输出: 消息你好世界

谁能告诉我我做错了什么?

【问题讨论】:

  • 在我也在写的clojure代码中- (defn -main [m] (Print m))

标签: java clojure clojure-java-interop


【解决方案1】:

有了这个

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

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

你似乎想要:

(doseq [s v]
  (prn s))

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

【讨论】:

  • 非常感谢您的回答。我会注意命名约定。
【解决方案2】:

请尝试类似的方法... map 函数可用于迭代集合 除了剂量... map、loop/recur 和用户定义的带有(first,empty?,rest)的递归函数也可以用来实现相同的目的。

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

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 2015-09-19
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2015-04-13
    相关资源
    最近更新 更多