Dictionary Clojure滤波器复向量

Dictionary Clojure滤波器复向量,dictionary,vector,filter,clojure,Dictionary,Vector,Filter,Clojure,我一直在尝试像这样过滤复杂向量 (def mySymbolT [[:name "salary" :type "string" :kind "static" :index 0] [:name "money" :type "string" :kind "static" :index 1] [:name "count" :type "int" :kind "field" :index 0]]) 我的目标是返回具有相同类型的元素的数量: 例如,对于“静态”类型,我希望答案是2。 到目前为止,

我一直在尝试像这样过滤复杂向量

(def mySymbolT [[:name "salary" :type "string" :kind "static" :index 0]
  [:name "money" :type "string" :kind "static" :index 1] 
  [:name "count" :type "int" :kind "field" :index 0]])
我的目标是返回具有相同类型的元素的数量: 例如,对于“静态”类型,我希望答案是2。 到目前为止,我写了以下内容:

(defn countKind [symbolTable kind]
  (count(map first(filter #(= (:kind %) kind) symbolTable))))

它不起作用。我必须说,我是Clojure的新手,我不太了解过滤器如何与map配合,所以我很乐意听到解释。(是的,我已经阅读了有关地图和过滤器的文档,但我仍然缺少解释,特别是当我尝试应用于大型向量时。)

您的数据最好表示为地图数组,而不是向量数组:

你可以从这里乘

(def your-table
  (mapv (partial apply array-map) mySymbolT))
现在我们可以

  • 将关键字
    :kind
    用作提取这些值的函数,然后
  • 核心功能<代码>频率返回您的请求
例如

(frequencies (map :kind your-table))
;{"static" 2, "field" 1}


顺便说一下,Clojure的习惯用法是在一个符号中连字符:
my-symbol-t
,而不是
mySymbolT

您的数据最好表示为地图数组,而不是向量数组:

你可以从这里乘

(def your-table
  (mapv (partial apply array-map) mySymbolT))
现在我们可以

  • 将关键字
    :kind
    用作提取这些值的函数,然后
  • 核心功能<代码>频率返回您的请求
例如

(frequencies (map :kind your-table))
;{"static" 2, "field" 1}


顺便说一下,Clojure的习惯用法是在一个符号中连字符:
my-symbol-t
,而不是
mySymbolT

@缩略图是正确的,最好重新排列数据的形式。但是,如果它来自其他地方,并且您只需要多次从中获取一些数据(特别是当内部列表非常短时:理论上,它甚至比将每个列表转换为映射并查找键还要快),您可以避免将其转换为像这样的映射向量:

首先,您可以创建一个函数,从向量中按名称获取属性值:

(defn plist-get [look-for items]
  (when (seq items)
    (if (= look-for (first items))
      (second items)
      (recur look-for (drop 2 items)))))
然后用它来得到你的结果:

user> (def data [[:name "salary" :type "string" :kind "static" :index 0]
                 [:name "money" :type "string" :kind "static" :index 1] 
                 [:name "count" :type "int" :kind "field" :index 0]])
#'user/data

user> (count (filter #(= "static" (plist-get :kind %)) data))
;;=> 2

@缩略图是正确的,最好重新排列数据的形式。但是,如果它来自其他地方,并且您只需要多次从中获取一些数据(特别是当内部列表非常短时:理论上,它甚至比将每个列表转换为映射并查找键还要快),您可以避免将其转换为像这样的映射向量:

首先,您可以创建一个函数,从向量中按名称获取属性值:

(defn plist-get [look-for items]
  (when (seq items)
    (if (= look-for (first items))
      (second items)
      (recur look-for (drop 2 items)))))
然后用它来得到你的结果:

user> (def data [[:name "salary" :type "string" :kind "static" :index 0]
                 [:name "money" :type "string" :kind "static" :index 1] 
                 [:name "count" :type "int" :kind "field" :index 0]])
#'user/data

user> (count (filter #(= "static" (plist-get :kind %)) data))
;;=> 2

我认为,如果要实现plist-get,不妨使用分区
(第二个(第一个(filter#(=查找(第一个%))(分区2项))
我认为如果要实现plist-get,最好使用分区<代码>(第二个(第一个(filter#)(=查找(first%))(分区2项))我切换到地图,尽管我更了解向量。例如,如何从频率中过滤“静态”计数?我来到了
(第二种(第一种)(滤镜(=(第一))种类)(频率(地图:种类符号表‘‘‘‘‘‘‘‘‘))
,有更好的方法吗?我切换到地图,尽管我更了解向量。例如,如何从频率中过滤“静态”计数?我来到了
(第二种(第一种(滤镜)(=(第一))种类)(频率(地图:种类符号表‘‘‘‘‘‘‘)’)
,有更好的方法吗?