首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在hash-map中映射每个值

在hash-map中映射每个值
EN

Stack Overflow用户
提问于 2013-01-30 13:22:34
回答 4查看 6.9K关注 0票数 11

我有一个哈希图。我希望遍历这些值,并根据值的类型替换每个值。如果值是整数,则将其替换为true,如果不是,则将其替换为false。我希望它返回一个新的散列映射,每个值都更新为true或false。

代码语言:javascript
运行
复制
(defn my-function [hash-map]
  (loop [hash-map hash-map]
    (for [value (vals hash-map)]
      (if (= Integer (type value))
        (recur (assoc hash-map key true))
        (recur (assoc hash-map key false))))))

这是行不通的,因为Clojure Can only recur from tail position,但这就是我想要做的。有没有什么有效的方法可以做到这一点?if-letupdate-in看起来像是潜在的解决方案,但我不太理解它们。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-30 15:32:01

代码语言:javascript
运行
复制
(reduce-kv (fn [m k v] (assoc m k (= Integer (type v)))) {} m)

或者更短,如果你喜欢的话:

代码语言:javascript
运行
复制
(reduce-kv #(assoc %1 %2 (= Integer (type %3))) {} m)

并保持映射类型(散列与排序):

代码语言:javascript
运行
复制
(reduce-kv #(assoc %1 %2 (= Integer (type %3))) (empty m) m)

注意:最后一个不适用于记录。

票数 18
EN

Stack Overflow用户

发布于 2013-01-30 19:51:39

您概述的操作--独立地转换映射中的每个值--实际上已经在the Functor module中实现了。

要使用它,您需要实现转换单个值的函数,然后在您的地图上使用fmap

代码语言:javascript
运行
复制
(fmap your-function your-map)

(不要被fmap这个名称所误导--这个操作不是特定于fmap的。因为它是一个泛型函数,所以它适用于任何具有函数器实例的对象,该函数器实例还包括列表、集合和向量)。这是一个保留结构的操作:不会更改任何键,不会添加新键,也不会删除任何键。

如果您希望避免使用泛型函数,只需查看the implementation

代码语言:javascript
运行
复制
(defmethod fmap clojure.lang.IPersistentMap
  [f m]
  (into (empty m) (for [[k v] m] [k (f v)])))  ;;; <== the important part!!

在那里f = your-functionm = your-map

此库已被移动(是否正在移动?将被移动?)敬clojure.algo.generic.functor。更多信息请参见this,源代码请参阅this

票数 5
EN

Stack Overflow用户

发布于 2013-01-30 14:46:25

代码语言:javascript
运行
复制
(letfn [(map-vals [m f]
          (into {} (for [[k v] m]
                     [k (f v)])))]
  (map-vals m #(= Integer (type %))))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14597245

复制
相关文章

相似问题

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