首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在映射向量中按键值查找前一项

在映射向量中按键值查找前一项
EN

Stack Overflow用户
提问于 2017-05-26 20:39:35
回答 2查看 274关注 0票数 2

我有这样的地图矢量:

代码语言:javascript
复制
[{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}]

现在我想在选择的id之前找到一个元素。例如:当我获得id = 10时,我想接收:

代码语言:javascript
复制
{:id 5 :val "v2"}

如果选择id =2,则返回零。

我刚开始学习语言编程,想不出这个问题的简单解决方案.(请帮助:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-26 21:30:43

您可以使用partition对相邻的映射进行配对,然后通过id搜索第二个映射的匹配:

代码语言:javascript
复制
(def ms [{:id 2 :val "v1"} {:id 5 :val "v2"} {:id 10 :val "v3"}])
(ffirst (filter #(= 10 (:id (second %))) (partition 2 1 ms)))
票数 3
EN

Stack Overflow用户

发布于 2017-05-29 14:47:26

接受的答案中的(partition 2 1 data)是一个选项,但是这里有两个基于“滞后”序列的备选方案。

这一项首先构造查找表(将下一个if映射到每个项),如果需要进行许多查找,则应该具有更好的性能。您甚至可以轻松地在map上通过它。但是这种方法要求ids是唯一的。

代码语言:javascript
复制
(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"}}]

第二个文档生成一个匹配的文档序列,如果可能有多个文档,则这是必要的:

代码语言:javascript
复制
(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)))。实际上,菲尔斯特在这种方法中非常有用。

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

https://stackoverflow.com/questions/44209839

复制
相关文章

相似问题

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