我有这样的地图矢量:
[{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]现在我想在选择的id之前找到一个元素。例如:当我获得id = 10时,我想接收:
{:id 5 :val "v2"}如果选择id =2,则返回零。
我刚开始学习语言编程,想不出这个问题的简单解决方案.(请帮助:)
发布于 2017-05-26 21:30:43
您可以使用partition对相邻的映射进行配对,然后通过id搜索第二个映射的匹配:
(def ms [{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}])
(ffirst (filter #(= 10 (:id (second %))) (partition 2 1 ms)))发布于 2017-05-29 14:47:26
接受的答案中的(partition 2 1 data)是一个选项,但是这里有两个基于“滞后”序列的备选方案。
这一项首先构造查找表(将下一个if映射到每个项),如果需要进行许多查找,则应该具有更好的性能。您甚至可以轻松地在map上通过它。但是这种方法要求ids是唯一的。
(let [data [{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]
ids (zipmap (map :id (rest data)) data)]
[(ids 10)
ids])
; [{:id 5, :val "v2"}
; {5 {:id 2, :val "v1"}, 10 {:id 5, :val "v2"}}]第二个文档生成一个匹配的文档序列,如果可能有多个文档,则这是必要的:
(let [data [{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]
next-ids (->> data rest (map :id))]
(->>
(map (fn [item next-id] (if (= 10 next-id) item))
data next-ids)
(filter some?)
first))
; {:id 5, :val "v2"}您可以通过使用partition获得类似的代码,但是不用使用#(...),而是使用析构:(fn [first-item second-item] (= 10 (:id second-item)))。实际上,菲尔斯特在这种方法中非常有用。
https://stackoverflow.com/questions/44209839
复制相似问题