首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure中哈希映射的结构和处理向量

Clojure中哈希映射的结构和处理向量
EN

Stack Overflow用户
提问于 2021-12-03 10:56:05
回答 2查看 202关注 0票数 0

我有一个散列图向量,如下所示:

代码语言:javascript
复制
(def my-maps [{:a 1} {:b 2}])

我希望在每个散列映射上循环,给出键并在循环中给出一个更有意义的名称,然后根据每个哈希映射的键进行不同的处理。

不要再多说了,我的最佳尝试是:

代码语言:javascript
复制
(for [m my-maps]
  (let [my-key-name (key m) my-val-name (val m)]
    (case my-key-name
      :a (println "Found key :a with value " my-val-name)
      :b (println "Found key :b with value " my-val-name))))

然而,这种方法产生了一个相当神秘的错误:

代码语言:javascript
复制
; Error printing return value (ClassCastException) at clojure.core/key (core.clj:1569).
; class clojure.lang.PersistentArrayMap cannot be cast to class java.util.Map$Entry (clojure.lang.PersistentArrayMap is in unnamed module of loader 'app'; java.util.Map$Entry is in module java.base of loader 'bootstrap')

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-03 11:11:10

您可以在for (或使用doseq)中进行重构:

代码语言:javascript
复制
(for [[[k v] & _] [{:a 1} {:b 2}]]
  (println "Found key" k "with value" v))

Found key :a with value 1
Found key :b with value 2
=> (nil nil)
票数 4
EN

Stack Overflow用户

发布于 2021-12-03 16:22:01

为了清晰起见,下面是一个更一般的答案,分为几个步骤:

代码语言:javascript
复制
  (let [my-maps [{:a 1} {:b 2 :c 3}]]
    (doseq [curr-map my-maps]
      (newline)
      (println "curr-map=" curr-map)
      (let [map-entries (seq curr-map)]
        (println "map-entries=" map-entries)
        (doseq [curr-me map-entries]
          (let [[k v] curr-me]
            (println "  curr-me=" curr-me "  k=" k  "  v=" v))))))

有结果

代码语言:javascript
复制
curr-map= {:a 1}
map-entries= ([:a 1])
  curr-me= [:a 1]   k= :a   v= 1

curr-map= {:b 2, :c 3}
map-entries= ([:b 2] [:c 3])
  curr-me= [:b 2]   k= :b   v= 2
  curr-me= [:c 3]   k= :c   v= 3

Clojure中的MapEntry对象可以被看作是一个2元素向量(通过first &second访问),也可以看作是通过keyval函数访问的MapEntry。破坏形式:

代码语言:javascript
复制
(let [[k v] curr-me] 

MapEntry对象curr-me视为序列,并将前2个元素提取到kv中。尽管它的打印方式类似于向量(如[:a 1]),但它确实具有clojure.lang.MapEntry类型。

原始答案的& _表达式中的析构语法for是一个"rest“解构。它导致将第一个MapEntry对象之后的所有_对象的顺序分配给变量_,然后在代码的其余部分中忽略该变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70213197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档