Clojure 如何创建基于多个向量的映射?

Clojure 如何创建基于多个向量的映射?,clojure,Clojure,我有一个向量定义表中的列,如下所示 (def列[“col1”“col2”“col3”“col4”]) 然后几个向量定义了列的类型和约束 (def maxInclude [nil nil 1000 nil]) (def minInlcude [nil 200 300 nil]) (def columntype [int float int int]) 然后我需要得到一个映射,如下所示:一个映射条目定义每个列,key是列名,value是该列的类型和约束 {:col1 {:columntype "

我有一个向量定义表中的列,如下所示

(def列[“col1”“col2”“col3”“col4”])

然后几个向量定义了列的类型和约束

(def maxInclude [nil nil 1000 nil])
(def minInlcude [nil 200 300  nil])
(def columntype [int float int int])
然后我需要得到一个映射,如下所示:一个映射条目定义每个列,key是列名,value是该列的类型和约束

{:col1 {:columntype "int"},
:col2 {:columntype "float" :minInlcude 200},
:col3 {:columntype "float" :minInlcude 300 :maxInclude 1000},
:col4 {:columntype "int" }
}

如何做到这一点?

我建议您将
columntype
定义为符号向量,而不是函数,因此:

(def columntype ['int 'float 'int 'int])
而不是:

(def columntype [int float int int])
还要注意,
minInlcude
拼写错误,我已将其重命名为
minInclude
。您可以使用以下命令创建结果(minInclude已重命名,columntype是符号向量):


符号的Clojure命名约定是以连字符分隔的,而不是大小写分隔的。因此,您应该考虑使用<代码> > max包含<代码> >而不是<代码> Max包含< /C> >p> 一种方法是同时映射所有向量。但是,您需要地图键的特定名称(例如,
columntype
等),因此以下解决方案并非真正通用:

(defn- constraints [cname type min max]
  {(keyword cname)
   (as-> {:columntype (str type)} cmap
         (if min
           (assoc cmap :minInclude min)
           cmap)
         (if max
           (assoc cmap :maxInclude max)
           cmap))})
这基本上为结果图中的每个“行”建立结果。这里需要注意的一点是Clojure类型int和float到字符串之间的映射。我想你并不真的想要Clojure类型的约束。如果我是对的,您可能应该将
columntype
中的数据更改为使用关键字(即
:int,:float
),并将上面的
str
更改为
name

然后,您可以使用
mapv
映射所有向量,模拟地从每个向量中获取第一个值,然后是第二个值,依此类推,并将其提供给
约束
函数:

(mapv constraints column maxInclude minInclude columntype) 
下面是一个运行示例:

user> (pprint (into {} (mapv constraints column columntype maxInclude minInclude)))
{:col1 {:columntype "clojure.core$int@607af697"},
 :col2 {:maxInclude 200, :columntype "clojure.core$float@4e8b32fb"},
 :col3
 {:maxInclude 300,
  :minInclude 1000,
  :columntype "clojure.core$int@607af697"},
 :col4 {:columntype "clojure.core$int@607af697"}}
nil
user> (pprint (into {} (mapv constraints column columntype maxInclude minInclude)))
{:col1 {:columntype "clojure.core$int@607af697"},
 :col2 {:maxInclude 200, :columntype "clojure.core$float@4e8b32fb"},
 :col3
 {:maxInclude 300,
  :minInclude 1000,
  :columntype "clojure.core$int@607af697"},
 :col4 {:columntype "clojure.core$int@607af697"}}
nil