Clojure 如何创建基于多个向量的映射?
我有一个向量定义表中的列,如下所示 (def列[“col1”“col2”“col3”“col4”]) 然后几个向量定义了列的类型和约束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 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