2017-07-03 116 views
0

我需要过滤地图,但是过滤器应该将该值与前一个进行比较,并且过滤后的地图应该只包含具有前一个不同信号的值。将地图值与clojure进行比较

这里有一个例子:

Map to filter: {:key1 100 :key2 10 :key3 -20 :key4 -10 :key5 10} 
Return: {:key3 -20 :key5 10} 

的我怎么能做到这一点任何sugestion?

+1

,如果你使用的分类地图,而不是直接映射的问题可能会更好,所以'(分拣地图:KEY1 100:10 KEY2:KEY3 -20:KEY4 -10:10 KEY5)'。那么* previous *的概念就有意义了。 –

+0

其我的理解是,小(少于8条)地图文字全部排序。所以在这个特定的例子中它很好,但对于更大的例子,它可能不是。 – user12341234

+0

对不起,我的错误,就像在真正的程序中这个键是日期,我可以创建它们的排序图。 – Pituca292

回答

2

我可能会使用partition-by,它根据序列何时改变值来分割一个序列。我们可以告诉partition-by查看这些值的“符号”,然后只取出每个块中的第一个结果。

(->> {:key1 100 :key2 10 :key3 -20 :key4 -10 :key5 10} 
    (partition-by #(Integer/signum (val %))) 
    rest 
    (map first)) 

=> ([:key3 -20] [:key5 10]) 
+3

地图中的按键没有排序,所以您需要定义“下一个”按键应该是什么,才能使其可靠工作。 – Lee

+0

虽然我同意你的评论,但我认为这是问题说明的问题,而不是我的答案。 – user12341234

+0

建议在你的第一行使用'(into(sorted-map)...)',使它实际上排序,并且在'(map first)'之后加入以实现OP提到的映射结果。 – Josh