我是 Clojure 菜鸟。我正在尝试采用一系列懒惰的地图并将其转换为单个地图。映射键是一个整数,值是一个向量。我见过很多合并地图的例子,例如
(merge map1 map2) ;;or
(into {} [{a: 1} {b: 2} {c: 3}])
Run Code Online (Sandbox Code Playgroud)
但是当它是一个懒惰的序列时我仍然有困难。当我使用:
(into {} mapSeq)
Run Code Online (Sandbox Code Playgroud)
它只返回序列中的最后一张地图。
(defn combine-maps [mapSeq]
(pp/pprint (into {} mapSeq))))
(defn file-input-to-vec [file]
(let [page (line-seq (clojure.java.io/reader file))
page-number (vec (mapv #(str/split %1 #" ") page))]
(combine-maps (for [i page-number]
{ :pageID (edn/read-string (first i))
:outpages (convert-to-int-vec (drop 1 i)) }))))
Run Code Online (Sandbox Code Playgroud)
我只得到最后一页:
{:pageID 6, :outpages [9770 0 8758 6103 9560 356 8469 3570 1178]}
Run Code Online (Sandbox Code Playgroud)
我想要这个:
{:pageID 0, :outpages [6 5 2 4 1 3],
:pageID 1, :outpages [0 461 4772 1324 1735 487 5668],
:pageID 2, :outpages [4412 0 209 3130 6902 8397 4373 905 3833],
:pageID 3, :outpages [5103 1203 7063 0 5866 445 5498 6217 6498],
... }
Run Code Online (Sandbox Code Playgroud)
你说你想要的返回值不是一个合法的映射,因为它有多次出现的 key:pageID和多次出现的 key :outpages。Clojure 映射(以及它们在大多数编程语言中的相应内容,例如 Python 中的字典)每个键最多出现一次。
如果您将想要的内容更新为有效的 Clojure 数据结构的返回值,那么有人可能会帮助编写代码。