首页 > 解决方案 > 将转导输出与输入结合到哈希图中

问题描述

我想尽可能惯用地在 Clojure 中执行以下操作:

  1. 转换集合
  2. 将输入集合的每个元素与输出集合中的相应元素相关联
  3. 在哈希图中返回结果

有没有一种简洁的方法可以使用核心库函数来做到这一点?

如果没有,您可以对以下实施提出哪些改进建议?

(defn to-hash [coll xform]
  (reduce
    merge
    (map
      #(apply hash-map %)
      (mapcat hash-map coll (into [] xform coll)))))

标签: clojure

解决方案


像这样的东西应该可以在没有中间集合的情况下解决问题:

(defn process [data xform]
  (zipmap data (eduction xform data)))

user> (process [1 2 3] (comp (map inc) (map #(* % %))))
;;=> {1 4, 2 9, 3 16}

关于教育的文档说以下内容:

将传感器的可简化/可迭代应用程序返回到 coll 中的项目。换能器按顺序应用,就像与 comp 结合使用一样。请注意,每次调用 reduce/iterator 时都会执行这些应用程序。

所以不会创建额外的集合。

当然,只要输入和输出元素之间存在一对一的关系,这样就可以了。(process [1 -2 3] (filter pos?))or的期望输出是什么(process [1 1 1 2 2 2] (dedupe))

(顺便说一句,你的to-hash实现有同样的缺陷)


推荐阅读