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_Map_Hashmap_Tuples - Fatal编程技术网

在Clojure中将元组数组转换为哈希映射

在Clojure中将元组数组转换为哈希映射,clojure,map,hashmap,tuples,Clojure,Map,Hashmap,Tuples,我有一个元组数组,其中每个元组是一个2元组,带有一个键和一个值。将此元组数组转换为哈希映射的最干净方法是什么?假设“tupel”表示“两个元素数组”: map是MapEntry元素的序列。每个映射条目都是一个键和值的向量。问题中的元组已经是MapEntry的形式,这使得事情变得很方便。(这也是为什么到解决方案是一个好的解决方案。) 美好的如果你(对OP)的“数组”实际上是一个seq,而不是(aget n),你可以使用(TN),这有点漂亮。(TN)不适用于序列。它与向量有关。但是您可以简单地使用(

我有一个元组数组,其中每个元组是一个2元组,带有一个键和一个值。将此元组数组转换为哈希映射的最干净方法是什么?

假设“tupel”表示“两个元素数组”:


map是MapEntry元素的序列。每个映射条目都是一个键和值的向量。问题中的元组已经是MapEntry的形式,这使得事情变得很方便。(这也是为什么
解决方案是一个好的解决方案。)


美好的如果你(对OP)的“数组”实际上是一个seq,而不是
(aget n)
,你可以使用
(TN)
,这有点漂亮。
(TN)
不适用于序列。它与向量有关。但是您可以简单地使用
(到{}向量数组中)
而不是
reduce
。注意,这也适用于两个元素数组的数组——您只需在数组参数周围添加一个
(map vec…
):
(到{}(map vec到两个元素数组的数组中))
,并且再次添加一个“duh”您在使用Clojure时经常会有这样的时刻。回答得不错。但是相对来说比较贵。@MichałMarczyk我不明白。。。如果您已经有一个数组,为什么要在它们上面映射
vec
?我认为
vec
只是让数组保持原样……为什么它必须是vector,为什么两个元素列表的列表不起作用?
flatte
对于这个问题来说太过分了。您可以利用MapEntry(键和值的向量)形式的元组。永远不要在这样的情况下使用
flatten
:如果恰好是数据结构,它也会很高兴地展平所有键和值!谢谢你的解释!所以只有2个元素的向量是MapEntry,因此(into{}[[:a1]{:b2}])可以工作,但是(into{}['(:a1){:b2}])不能工作。它会得到错误“java.lang.ClassCastException:clojure.lang.Keyword不能转换为java.util.Map$Entry”。我想知道为什么Clojure不能在这个上下文中以相同的方式处理所有2个元素序列。这将使它更加一致。为什么没有呢?
(reduce 
  (fn [m tupel] 
      (assoc m 
            (aget tupel 0) 
            (aget tupel 1))) 
  {} 
  array-of-tupels)
user=> (def a [[:a 4] [:b 6]])
user=> (apply hash-map (flatten a))
{:a 4, :b 6}
user=> (into {} [[:a 1] [:b 2]])
{:a 1, :b 2}
user=> (reduce conj {} [[:a 1] [:b 2]])
{:b 2, :a 1}