Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 将映射键和值转换为字符串数组_Clojure - Fatal编程技术网

Clojure 将映射键和值转换为字符串数组

Clojure 将映射键和值转换为字符串数组,clojure,Clojure,如何将clojure映射转换为字符串,几乎是键值对,如下所示: Clojure数据: (def data { :starks "Winter is coming" :Lannisters "Hear me roar" }) 我想把上面的转换成 "starks" "winter is coming" "Lannisters" "hear me roar" 我不需要任何标识符/分隔符,但很明显,“starks”后面应该总是跟着“冬天来了” 我试过这个: (str (keys data) (val

如何将clojure映射转换为字符串,几乎是键值对,如下所示:

Clojure数据:

(def data { :starks "Winter is coming" :Lannisters "Hear me roar" })
我想把上面的转换成

"starks" "winter is coming" "Lannisters" "hear me roar"
我不需要任何标识符/分隔符,但很明显,
“starks”
后面应该总是跟着
“冬天来了”

我试过这个:

(str (keys data) (vals data))
哪个输出:

"(:starks :Lannisters)(\"Winter is coming\" \"Hear me roar\")"
这根本不是我想要的

  • 地图数据键和值并不总是相同的,因此需要通用
  • 始终只有一个级别,如中所示,该值不包含嵌套映射等

编辑

我真正想做的是:

我试图用clojure索引几千个节点。为了帮助我完成这项任务,我正在使用library

根据,添加到索引的
接受如下属性和值:

(nn/add-to-index (:id node) (:name idx) "username" "joe")))
在我上面的例子中

(nn/add-to-index (:id node) (:name idx) "starks" "winter is coming" "Lannisters" "Hear me roar")))
现在,我有了我的节点,我可以使用
(:data Node)
访问节点属性,这给了我一个clojure映射

属性在节点之间差异很大,因此我试图找出如何以它理解的方式将该映射传递给库

他的回答让我几乎达到了目的

(map name (apply concat data))
仍然抱怨第三个参数,因为它的结果周围有大括号

那么,我怎样才能做到这一点呢? 如果不是的话,我是否需要编写大量的
块来构建属性


谢谢

这应该可以做到:

(map name (apply concat data))
一个映射可以被看作是一个键值对序列,而键值对又表示为2个元素的数组。我们将这些对连接起来,然后从关键字和字符串中提取名称(对于字符串,这不起任何作用,对于关键字,它返回不带“:”的位)

根据您发布的代码,我猜您会这样使用:

(apply nn/add-to-index (list* (:id node) (:name idx) (map name (apply concat data))))

您可以使用vector进行类似数组的随机访问:

=> (def v (vec (map name (apply concat data))))
=> (v 0)
;"starks"
=> (v 1)
;"Winter is coming"

您可以尝试以下方法:

=> (interleave (map name (keys data)) (vals data))

;; which returns ("starks" "Winter is coming" "Lannisters" "Hear me roar")
(nn/addtoindex…)
函数只接受四个参数。节点、索引和一个键/值对。所以你有太多的循环通过你的数据,比如

(doseq [[k v] data]
  (nn/add-to-index (:id node) (:name idx) (name k) (clojure.string/lower-case v))))

与Clojure中的
str
函数不同,
添加到索引
函数的限制更大,不接受可变参数列表。

您好,谢谢!这几乎让我达到了目的,但我的绳子周围有一个大括号。。类似这样:
(“斯塔克斯”“冬天来了”“兰尼斯特”“听我吼”)
-尝试转换为字符串并替换它并没有按预期工作。。请问我怎样才能去掉牙套?我只需要把它当作一根绳子example@LocustHorde好的,我已经更新了我的答案。我希望这就是您要找的。您好,抱歉,我可能无法正确通信,我需要字符串数组,其中键和它们各自的值相邻。。我会更新这个问题。。非常感谢。事实上,再考虑一下,我可能可以用这个,让我试试,然后回来。谢谢。好的,我给了它最后一次机会:)嗨,谢谢,这和马吕斯·达尼拉的答案一样。这个问题的最新答案告诉我,这个函数实际上不接受超过4个参数。我发誓我以为我可以传递任意数量的参数给它!但是谢谢!哦,现在说得太有道理了!非常感谢,我将修改我的代码以反映这一点。再次感谢!是的,非常好用,谢谢!我发誓我可以同时添加多个属性。。但显然我在想别的事情。再次感谢!